日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

符号表 C++

發布時間:2024/3/24 c/c++ 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 符号表 C++ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

符號表是一張抽象的表格, 將信息存儲到里面, 可以按指定的鍵來搜索獲取這些信息,且鍵不能重復。 例如:數據庫。

編譯器可以用符號表來根據變量名來找到對應的值和類型。

無序鏈表的符號表:

用鏈表實現的符號表
符號表的API為

void put(KEY k, VAL v); //插入值 VAL get(KEY k); //得到對應鍵的值 void delete(KEY k); //刪除鍵為k的鍵和值 bool contains(KEY k); //表中是否包含鍵k bool is_empty(KEY k); //表是否為空 int size(); //表中的元素數 KEY max(); //最大的鍵 KEY min(); //最小的鍵

其中插入操作比較特殊
先遍歷鏈表, 查找表中是否已經存在鍵k, 若存在,則改變鍵k的val值, val = v; 若不存在, 新建一個節點插入到表頭。

void put(KEY k, VAL v){for(node<KEY, VAL> *t = first; t != NULL; t = t->next)if(t->key == k){t->val = v; return;}first = new node<KEY, VAL>(k, v, first); }

完整的代碼實現如下:

#include<iostream> using namespace std; template <class KEY, class VAL> class node{public:KEY key;VAL val;node<KEY, VAL> *next;node<KEY, VAL> (){key = NULL; val = NULL; next = NULL;}node<KEY, VAL>(KEY k, VAL v, node<KEY, VAL> *n){key = k; val = v; next = n;} }; template <class KEY, class VAL> class Seq_search_ST{node<KEY, VAL> *first;public:Seq_search_ST(){first = new node<KEY, VAL>(); first = NULL;}void put(KEY k, VAL v){for(node<KEY, VAL> *t = first; t != NULL; t = t->next)if(t->key == k) {t->val = v; return;}first = new node<KEY, VAL>(k, v, first);}VAL get(KEY k){for(node<KEY, VAL> *t = first; t != NULL; t = t->next)if(t->key == k) return t->val;return NULL;}void del(KEY k){if(first->key == k){first = first->next; return;}for(node<KEY, VAL> *t = first; t != NULL; t = t->next)if(t->next->key == k){t ->next = t->next->next; return;}cout << "key is not exist\n";}bool contains(KEY k){for(node<KEY, VAL> *t = first; t != NULL; t = t->next)if(t->key == k) return true;return false;}bool is_empty(){return first->key == NULL;}int size(){int cnt = 0;for(node<KEY, VAL> *t = first; t != NULL; t = t->next) cnt++;return cnt;}KEY Min(){VAL min_val = first->val;KEY min_key = first->key;for(node<KEY, VAL> *t = first->next; t != NULL; t = t->next)if(t->val < min_val) {min_val = t->val; min_key = t->key;} return min_key;}KEY Max(){VAL max_val = first->val;KEY max_key = first->key;for(node<KEY, VAL> *t = first->next; t != NULL; t = t->next)if(t->val > max_val) {max_val = t->val; max_key = t->key;} return max_key;} }; int main(){Seq_search_ST<int, double> st;st.put(1,4);st.put(2,5);cout << st.Min();return 0; }

有序數組的符號表

因為用鏈表實現, 插入和刪除操作很慢, 所以有了用有序數組存儲的符號表, 基于二分查找。

核心操作為

int rank(KEY k){int lo = 0, hi = N - 1;while(lo <= hi){int mid = lo + (hi - lo) / 2;if(keys[mid] < k) lo = mid + 1;else if(keys[mid] > k) hi = mid - 1;else return mid;}return lo; }

該函數可返回小于鍵k的個數。

插入操作:
先調用rank函數, 判斷表中是否已經存在鍵k, 若存在, 則更新鍵k的val, 若不存在, 把rank的返回值后面的數值中的值都往后移一位, 然后插入。

刪除操作:
調用rank函數, 返回其鍵k的位置, 刪除, 若不存在鍵k, 直接返回。

#include<iostream> using namespace std; template <class KEY, class VAL> class Binary_search_ST{KEY *keys;VAL *vals;int N;public:Binary_search_ST(int capacity){keys = new KEY[capacity]; vals = new VAL[capacity]; N = 0;}int rank(KEY k){int lo = 0, hi = N-1; while(lo <= hi){int mid = lo + (hi - lo) / 2;if(keys[mid] < k) lo = mid + 1;else if(keys[mid] > k) hi = mid - 1;else return mid;}return lo;}void put(KEY k, VAL v){int i = rank(k);if(i < N && keys[i] == k){vals[i] = v; return;}for(int j = N; j > i; --j){keys[j] = keys[j-1]; vals[j] = vals[j-1];}keys[i] = k; vals[i] = v;N++;}VAL get(KEY k){if(N == 0) return NULL;int i = rank(k);if(i < N && keys[i] == k) return vals[i];return NULL;}void del(KEY k){int i = rank(k);if(i < N && keys[i] == k){if(i == N-1) {N--; return;}for(int j = N - 1; j > i; --j){keys[j-1] = keys[j];vals[j-1] = vals[j]; }N--; }else cout << "key is not exist\n";}bool contains(KEY k){int i = rank(k);if(i < N && keys[i] == k) return true;return false;}KEY min(){return keys[0];}KEY max(){return keys[N-1];}KEY ceiling(KEY k){int i = rank(k);}}; int main(){Binary_search_ST<int, double> st(10);st.put(1, 2);st.put(2, 3);//st.del(2);if(st.contains(2))cout << "yes\n";return 0; }

總結

以上是生活随笔為你收集整理的符号表 C++的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。