符号表 C++
符號表是一張抽象的表格, 將信息存儲到里面, 可以按指定的鍵來搜索獲取這些信息,且鍵不能重復。 例如:數據庫。
編譯器可以用符號表來根據變量名來找到對應的值和類型。
無序鏈表的符號表:
用鏈表實現的符號表
符號表的API為
其中插入操作比較特殊
先遍歷鏈表, 查找表中是否已經存在鍵k, 若存在,則改變鍵k的val值, val = v; 若不存在, 新建一個節點插入到表頭。
完整的代碼實現如下:
#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, 直接返回。
總結
- 上一篇: java resultmap_mybat
- 下一篇: PhotoSwipe之API(4)