博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
广义表
阅读量:6833 次
发布时间:2019-06-26

本文共 2786 字,大约阅读时间需要 9 分钟。

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<assert.h>
using namespace std;
enum NODETYPE
{
    HEAD,
    VALUE,
    SUB
};
struct GeneralizedNode
{
    NODETYPE _type;
    GeneralizedNode* _next;
    union
    {
        char _value;
        GeneralizedNode* _sublist;
    };
    GeneralizedNode(NODETYPE type = HEAD, char value = 0)
        :_type(type)
        , _next(NULL)
    {
        if (_type == VALUE)
        {
            _value = value;
        }
        else if (_type == SUB)
        {
            _sublist = NULL;
        }
    }
};
class GeneralizedList
{
public:
    GeneralizedList(const char* str)
    {
        _head = _CreateList(str);
    }
    ~GeneralizedList()
    {
        _Clean(_head);
    }
    void Print()
    {
        _Print(_head);
        cout << endl;
    }
    void Size()
    {
        cout<<_Size(_head)<<endl;
    }
protected:
    GeneralizedNode* _CreateList(const char*& str)  //这里的str为二级指针  所以要用引用
    {
        assert(*str == '(');
        GeneralizedNode* head = new GeneralizedNode(HEAD);
        GeneralizedNode* cur = head;
        str++;                                    //方便处理  开始  和  字链表  这两种情况
        // 一搬情况:
        //          (a,b,c)
        //          (a,(b,c),d)
        //          (a,   b,c)
        //          ()
        //          (())
        //           1:值  2:‘(’  3:‘)’  4:逗号 空格等等无关符号
        while (*str != NULL)
        {
            if (_IsValue(*str))                  //  是值的情况
            {
                GeneralizedNode* tem = new GeneralizedNode(VALUE, *str);
                cur->_next = tem;
                cur = tem;
                str++;
            }
            else if (*str == '(')                // 是子链表的情况
            {
                GeneralizedNode* sub = new GeneralizedNode(SUB);
                cur->_next = sub;
                cur = sub;
                sub->_sublist = _CreateList(str);//循环构造子链
            }
            else if (*str == ')')                //子表结束的情况
            {
                str++;
                return head;
            }
            else                                 //逗号 空格等等无关符号的情况
            {
                str++;
            }
        }
        return head;
    }
    bool _IsValue(char ch)
    {
        if ((ch >= '0' && ch <= '9') || \
            (ch >= 'a' && ch <= 'z') || \
            (ch >= 'A' && ch <= 'Z'))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    void _Print(GeneralizedNode* head)
    {
        GeneralizedNode* cur = head;
        while (cur != NULL)
        {
            if (cur->_type == HEAD)
            {
                cout << "(";
            }
            else if (cur->_type == VALUE)
            {
                cout << cur->_value;
                if (cur->_next != NULL)
                {
                    cout << ",";
                }
            }
            else
            {
                _Print(cur->_sublist);
                cout << ",";        //注意子链打印完了也要打印一个  ,
            }
            cur = cur->_next;
        }
        cout << ")";
    }
    int _Size(GeneralizedNode* head)
    {
        //assert(head);
        int count = 0;
        GeneralizedNode* cur = head;
        while (cur != NULL)
        {
            //if (cur->_type == HEAD)
            //{
            //    cur = cur->_next;   //下面有这个操作  可以合并
            //}
            if (cur->_type == VALUE)
            {
                count++;
            }
            else if (cur->_type == SUB)
            {
                count += _Size(cur->_sublist);
            }
            cur = cur->_next;
        }
        return count;
    }
    void _Clean(GeneralizedNode* head)
    {
        GeneralizedNode* cur = head;
        while (cur != NULL)
        {
            GeneralizedNode* del = cur;
            if (cur->_type == HEAD || cur->_type == VALUE)
            {
                cur = cur->_next;
                delete(del);
            }
            else
            {
                _Clean(cur->_sublist);
                cur = cur->_next;
            }
        }
    }
protected:
    GeneralizedNode* _head;
};
void Test1()
{
    char* s1 = "(a,b,c,d)";
    char* s2 = "(a,(b,c),d)";
    char* s3 = "(())";
    GeneralizedList L1(s1);
    GeneralizedList L2(s2);
    GeneralizedList L3(s3);
    L1.Print();
    L2.Print();
    L3.Print();
    L1.Size();
    L2.Size();
    L3.Size();    
}
int main()
{
    Test1();
    return 0;
}

本文转自 ye小灰灰  51CTO博客,原文链接:http://blog.51cto.com/10704527/1762361,如需转载请自行联系原作者
你可能感兴趣的文章
linux 进程管理
查看>>
sqoop 的安装 及与hdfs hive base结合使用
查看>>
我的友情链接
查看>>
如何成为一名优秀的项目经理
查看>>
【跟着我们学Golang】基础结构
查看>>
volatile
查看>>
Confluence 6 数据库整合有关你数据库的大小写敏感问题
查看>>
Confluence 6 生产环境备份策略
查看>>
Django进阶-Forms模块实例
查看>>
linux学习计划第一周
查看>>
Dubbo的一次体验与分析
查看>>
工厂模式
查看>>
Linux系统安装初始化及优化脚本
查看>>
2FSK:Error: Unexpected MATLAB expression.
查看>>
SpringMVC + MyBatis整合
查看>>
远程桌面的开启和故障处理
查看>>
我的友情链接
查看>>
Linux 下 /dev/zero 和 /dev/null
查看>>
quartz定时任务时间设置
查看>>
我的友情链接
查看>>