c++ 之廣義表

   廣義表(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;
};

wKioL1cQWdiD6QOkAABO7Rij3ec565.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章