zoukankan      html  css  js  c++  java
  • 广义表

    广义表的实现:

      1 #include<iostream>
      2 #include<assert.h>
      3 using namespace std;
      4 enum Type
      5 {
      6     HEAD,
      7     VALUE,
      8     SUB,
      9 };
     10 struct GeneralListNode
     11 {
     12     Type _type;
     13     GeneralListNode* next;
     14     union
     15     {
     16         char _value;
     17         GeneralListNode* _sublink;
     18     };
     19     GeneralListNode(Type type=VALUE, char value = 0) :_type(type), next(NULL)
     20     {
     21         if (_type == VALUE)
     22         {
     23             _value = value;
     24         }
     25         else if (_type == SUB)
     26         {
     27             _sublink = NULL;
     28         }
     29     }
     30 };
     31 class Generalist
     32 {
     33 
     34 public:Generalist() :_head(NULL) {}
     35        ~Generalist()  
     36        {
     37            _Destory(_head); 
     38        }
     39        Generalist(char* s) :_head(NULL)
     40        {
     41            _head = _CreateGeneraList(s);
     42        }
     43        size_t size()
     44        {
     45            return _size(_head);
     46        }
     47        size_t Depth()
     48        {
     49            return _Depth(_head);
     50        }
     51        void Print()
     52        {
     53            _Print(_head);
     54            cout << endl;
     55        }
     56 protected:
     57     GeneralListNode* _CreateGeneraList(char*& s)
     58     {
     59         assert(*s =='(');
     60         GeneralListNode* head = new GeneralListNode(HEAD);    
     61         ++s;
     62         GeneralListNode* cur = head;
     63 
     64 
     65         while (*s)
     66         {
     67             if (*s == '(')
     68             {
     69                 GeneralListNode* subNode = new GeneralListNode(SUB);
     70                 cur->next = subNode;
     71                 cur = cur->next;
     72                 subNode->_sublink = _CreateGeneraList(s);
     73             }
     74             else if (*s == ')')
     75             {
     76                 ++s;
     77                 break;
     78             }
     79             else if (ISvalue(*s))
     80             {
     81                 GeneralListNode* valueNode = new GeneralListNode(VALUE, *s);
     82                 cur->next = valueNode;
     83                 cur = cur->next;
     84                 ++s;
     85             }
     86             else
     87             {
     88                 ++s;
     89             }
     90         }
     91         return head;
     92     }
     93 protected:
     94     void _Destory(GeneralListNode* head)
     95     {
     96         GeneralListNode* cur = head;
     97         while (cur)
     98         {
     99             GeneralListNode* del = cur;
    100             cur = cur->next;
    101             if (del->_type == SUB)
    102             {
    103                 _Destory(del->_sublink);
    104             }
    105             delete del;
    106         }
    107     }
    108     size_t _size(GeneralListNode* head)
    109     {
    110         GeneralListNode*cur = head;
    111         size_t size = 0;
    112 
    113         while (cur)
    114         {
    115             if (cur->_type = VALUE)
    116             {
    117                 ++size;
    118             }
    119             else if (cur->_type = SUB)
    120             {
    121                 size += _size(cur->_sublink);
    122             }
    123             cur = cur->next;
    124         }
    125         return size;
    126     }
    127     void _Print(GeneralListNode* head)
    128     {
    129         GeneralListNode*cur = head;
    130         while (cur)
    131         {
    132             if (cur->_type = HEAD)
    133             {
    134                 cout << "(";
    135             }
    136             else if (cur->_type = VALUE)
    137             {
    138                 cout << cur->_value;
    139                 if (cur->next)
    140                 {
    141                     cout << ",";
    142                 }
    143             }
    144             else
    145             {
    146                 _Print(cur->_sublink);
    147                 if (cur->next)
    148                 {
    149                     cout << ",";
    150                 }
    151             }
    152             cur = cur->next;
    153         }
    154         cout << ")";
    155     }
    156     size_t _Depth(GeneralListNode* head)
    157     {
    158         size_t depth = 1;
    159         GeneralListNode* cur = head;
    160 
    161         while (cur)
    162         {
    163             if (cur->_type == SUB)
    164             {
    165                 size_t subDepth = _Depth(cur->_sublink);
    166                 if (subDepth + 1 > depth)
    167                 {
    168                     depth = subDepth + 1;
    169                 }
    170             }
    171             cur = cur->next;
    172         }
    173         return depth;
    174     }
    175 public:
    176     bool ISvalue(char ch)
    177     {
    178         if ((ch >= '0'&&ch <= '9') || (ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z'))
    179         {
    180             return true;
    181         }
    182         else
    183         {
    184             return false;
    185         }
    186     }
    187 protected:
    188     GeneralListNode* _head;
    189 };
    190 int main()
    191 {
    192     Generalist g1("()");
    193     Generalist g2("(a,b)");
    194     Generalist g3("(a,b,(c,d))");
    195     Generalist g4("(a,b,(c,d),(e,(f),h))");
    196     g4.Print();
    197     cout << g4.size() << endl;
    198     cout << g3.size() << endl;
    199 
    200     system("pause");
    201     return 0;
    202 }
  • 相关阅读:
    You need to use a Theme.AppCompat theme
    Objective-C中nil与release的区别与用法
    objective-c中自己创建的对象为什么不能调用release
    NSString类的相关用法
    [Bug-IOS]
    中国有什么旅游社交网站吗?
    om.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException
    【剑指Offer学习】【面试题22:栈的压入、弹出序列】
    2-08. 用扑克牌计算24点(25) (ZJU_PAT 数学 枚举)
    在北京工作了两年,如今跳槽到了广州,社保公积金该怎样办理?
  • 原文地址:https://www.cnblogs.com/yuanshuang/p/5402163.html
Copyright © 2011-2022 走看看