廣義表(Lists,又稱列表)是一種非線性的數據結構,是線性表的一種推廣。即廣義表中放鬆對錶元素的原子限制,容許它們具有其自身結構。它被廣泛的應用於人工智能等領域的表處理語言LISP語言中。在LISP語言中,廣義表是一種最基本的數據結構,就連LISP 語言的程序也表示爲一系列的廣義表。 代碼實現如下 #pragma once #include<assert.h> #include<iostream> using namespace std; enum Type { HEAD, VALUE, SUB }; struct GeneralizedNode//節點包含 類型 值域 以及next指針 字表指針 { Type _type; GeneralizedNode *next;//指向同級的next union { int _value; GeneralizedNode *_Sublink; }; GeneralizedNode() :next(NULL), _value(0) {} }; class Generalize { public: Generalize(const char *str) { char *str1 = (char *)str; _head = CreatGeneralize(str1); } void print() { _print(_head); cout << endl; } size_t size() { return _size(_head); } size_t depth(); private: size_t _depth(GeneralizedNode *tmp)//最大嵌套層數 { int count = 0; } size_t _size(GeneralizedNode *tmp) { GeneralizedNode *cur = tmp; int count = 0; while (cur) { if (cur->_type == VALUE) { ++count; } else if (cur->_type == SUB) { count += _size(cur->_Sublink); } cur = cur->next; } return count; } void _print(GeneralizedNode *tmp) { GeneralizedNode *cur = tmp; while (cur) { if (cur->_type == HEAD) cout << '('; else if (cur->_type==VALUE) { cout << cur->_value; if (cur->next == NULL) cout << ')'; else { cout << ','; } } else { _print(cur->_Sublink); cout << ','; } cur = cur->next; } } GeneralizedNode* CreatGeneralize(char *&str) { while (*str) { if (*str == '(')//開始構成表。 { GeneralizedNode *_head = new GeneralizedNode; _head->_type = HEAD; GeneralizedNode *cur = _head; _head->_type = HEAD; ++str; while (*str) { if (IsValue(*str))//是一個數字 { GeneralizedNode *tmp = new GeneralizedNode; tmp->_type = VALUE; tmp->_value = *str; //++str; cur->next = tmp; cur = cur->next; ++str; } else if (*str == '(') { GeneralizedNode* sub = new GeneralizedNode; sub->_type = SUB; sub->_Sublink = CreatGeneralize(str); cur->next = sub; cur = cur->next; } else if (*str == ')') { ++str; return _head; } else { ++str; } } return _head; } return _head; } } bool IsValue(char p) { if (p >= 'a'&&p <= 'z' || p >= 'A'&&p <= 'Z' || p >= '0'&&p <= '9') return true; return false; } private: GeneralizedNode *_head; };
c++ 之廣義表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.