题目描述:

 解析:

题目要求用递归做,当然这个题用也可以做。

(1)栈

遇见一个“(”就把它压入栈,遇见一个“)”就出栈一个“(”。最后如果栈为空说明表达式输入正确,否则表达式有误。同时,考虑到有同等深度的左括号和右括号,所以每入栈一个“(”,就记录当前的栈的元素个数,更新Max_len值(可能出栈以后,后面来了深度更大的)。

(2)递归

用到了联合体union,讲道理不是很懂,等我看懂了再来注解吧。先抄上代码。

知识点:

表头表尾表示法及求深度。

代码:

(1)用栈实现:

#include <iostream>
#include<string>
#include<stack>
using namespace std;void Init_Stack(stack<char>stk)
{while(!stk.empty())stk.pop();
}
int main()
{string str;cin>>str;int len=str.size();//len=str.length()//创建一个栈stack<char>stk;Init_Stack(stk);int Max_depth=0;//记录最大深度for(int i=0;i<len;i++){if(str[i]=='('){stk.push(str[i]);if(stk.size()>Max_depth)Max_depth=stk.size();}else if(str[i]==')')stk.pop();}if(!stk.empty())cout<<"输入表达式有误"<<endl;elsecout<<Max_depth<<endl;return 0;
}

(2)递归实现:

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;typedef enum {ATOM,LIST} ElemTag;
typedef char AtomType;
typedef struct GLNode//GLNode是一个类型名
{ElemTag tag;//标志域union{char atom;struct{GLNode *hp,*tp;}ptr;//ptr是列表,hp,tp分别指向该列表的表头和表尾};GLNode(){ptr.hp=ptr.tp=NULL;}
}*List;//List是指向GLNode类型变量的指针类型class GLists
{
public:void GetGList(List&);//得到广义表void CopyGList(List&,List&);//复制广义表void ListTraverse(List);int GListDepth(List&);//求广义表深度
private:void CreatGList(List&,string&);//递归建立广义表void sever(string&,string&);//存储广义表的字符串处理
};void GLists::GetGList(List& l)
{//cout<<"Please Input The Lists :"<<endl<<endl;string str;cin>>str;CreatGList(l,str);
}void GLists::CreatGList(List& l,string& s)//根据给定字符串s,从l递归创建广义表
{List p,q;//广义表节点类型变量string sub,hsub;//两个字符串if(s=="()")//空表l=NULL;//l置空else//非空表{l=new GLNode;//建立节点if(s.size()==1)//原子类型{l->tag=ATOM;//标志域l->atom=s[0];//原子}//ifelse//列表类型{l->tag=LIST;//标志域p=l;sub=s.substr(1,s.size()-2);//脱去括号do//根据得到的列表字符串建立新的广义表{sever(sub,hsub);//得到列表中“最小单位”hsub,然后把sub置成去掉最小单位的剩余字符串CreatGList(p->ptr.hp,hsub);//递归建立广义表q=p;//记录pif(!sub.empty())//为下一个节点提前开辟节点空间{p=new GLNode;p->tag=LIST;//更改标志域q->ptr.tp=p;//连接节点}}while(!sub.empty());}}//else
}void GLists::CopyGList(List& t,List& l)//复制广义表l->t
{if(!l) t=NULL;//l是空表else{t=new GLNode;//开辟节点t->tag=l->tag;//标志域if(l->tag==ATOM)//是原子节点t->atom=l->atom;//复制原子else//列表{CopyGList(t->ptr.hp,l->ptr.hp);//递归复制表头CopyGList(t->ptr.tp,l->ptr.tp);//递归复制表尾}}
}int GLists::GListDepth(List& l)//求广义表深度
{int max=0,dep;List p=l;if(l==NULL) return 1;//空表深度为1if(l->tag==ATOM) return 0;//原子深度为零//非空列表情况for(;p;p=p->ptr.tp)//遍历列表{dep=GListDepth(p->ptr.hp);//递归求深度if(dep>max)//更新maxmax=dep;}return max+1;//返回深度
}void GLists::sever(string &str,string &hstr)//广义表字符串处理
{//将非空字符串分割成两部分hstr为第一个','之前的部分,str为之后的部分int n=str.size(),i=0,k=0;do{if(str[i]=='(') k++;if(str[i]==')') k--;i++;}while(i<n&&(str[i]!=','||k!=0));if(i<n){hstr=str.substr(0,i);str=str.substr(i+1,n-i-1);}else{hstr=str;str.erase(str.begin(), str.end());}
}void GLists::ListTraverse(List L)//广义表遍历
{if(L->tag==ATOM){cout<<L->atom<<",";}else{cout<<"(";while(L!=NULL){ListTraverse(L->ptr.hp);L=L->ptr.tp;}cout<<")";}
}int main()
{GLists gl;List l;gl.GetGList(l);cout<<gl.GListDepth(l)<<endl;cout<<gl.GListDepth(l)<<endl;//system("pause");return 0;
}

【数据结构】NOJ014—求广义表深度相关推荐

  1. 【数据结构】NOJ014 求广义表深度

    //[数据结构]NOJ014 求广义表深度 //表头-表尾表示法#include <stdio.h> #include <stdlib.h> #include <stri ...

  2. 数据结构14——求广义表深度(严5.30)

    Description 试按表头.表尾的分析方法编写求广义表的深度的递归程序. Input 输入一串以'('开始,以'('结束的字符串,并且输入的左右括号必须匹配,如:(),(())-- Output ...

  3. 西北工业大学NOJ数据结构—014求广义表深度

    #include <stdio.h> #include <stdlib.h>typedef struct Node {int A_L;//使用枚举不熟练,A_T代表Atom或L ...

  4. 【数据结构】NOJ014 求广义表深度(严5.30)

    1. 题目 示例输入 ((a,b,(c,(d,e),f)),g) 示例输出 4 4 2. 代码 先写个不符合题目要求的简单代码完成作业,,,有时间再按要求填坑. #include <iostre ...

  5. noj14求广义表深度

    广义表理论上很好理解,但是我感觉对我来说上手还有点困难(还是太菜). 先看广义表的一些定义吧 1 )什么是广义表 广义表,又称列表,也是一种线性存储结构,既可以存储不可再分的元素,也可以存储广义表,记 ...

  6. 广义表-求广义表深度,建立广义表,复制广义表

    广义表-求广义表深度,建立广义表,复制广义表 例: 广义表(a,(a,b),d,e,((i,j),k)) 求广义表的长度和深度 长度为5,深度为3 长度:有效逗号个数+1 深度:有效括号个数 求广义表 ...

  7. 求广义表深度(严5.30)

    Description 试按表头.表尾的分析方法编写求广义表的深度的递归程序. Input 输入一串以'('开始,以'('结束的字符串,并且输入的左右括号必须匹配,如:(),(())-- Output ...

  8. noj14 求广义表深度

    关键是创建广义表 //求广义表深度 #include <stdio.h> #include <stdlib.h> #include <string.h>typede ...

  9. 西工大NOJ数据结构理论——014.求广义表深度(严5.30)

    第一下拿到这道题,我的脑袋轰一下就大了.如果说用"括号匹配"来做的话,这其实很简单.但是如果要用广义表来做的话,难度哗哗哗的就涨上来了.为什么呢?首先,要把读入的字符串存到广义表里 ...

最新文章

  1. 使用Ethereum C++ Aleth客户端创建具有两个同步节点的以太坊Ethereum私有网络
  2. 【博士论文】机器学习中的标记增强理论与应用研究
  3. Educational Codeforces Round 64 -C(二分)
  4. .NET工程师的书单
  5. 大数据学习笔记34:Hive - 数据库与表操作
  6. JavaScript之 Bom+Dom
  7. debugging tools for windows 10下载安装问题
  8. 博文视点Open Party ——漏洞分析
  9. UnicodeDecodeError: 'ascii' codec can't decode byte 0xf6 in position 0: ordinal not in range(128)
  10. 解读2021年智源 AI 前沿报告:医疗领域最新进展
  11. torch.manual_seed(args.seed) torch.cuda.manul_seed_all(args.seed)和numpy.random.seed()
  12. 夏普科学计算机标准差,疯狂期货夏普比率公式里面标准差实际应该怎么算
  13. 代码实现数学图形之常用函数,幂,对数,指数,正弦,余弦,正切,余切,反正弦,反余弦,反正切,反余切,双曲正弦,双曲余弦,双曲正切,双曲余切,正割函数,余割函数,双曲正割,双曲正割.
  14. 2019软件测试学习教程(学习路线+课程大纲+视频教程+学习工具)
  15. flex-flex属性
  16. icc校色文件使用教程_Win7系统色彩管理显示器ICC设置的操作方法
  17. 计算机Excel设置透视图,电脑Excel表格中数据透视图怎么制作
  18. 导图解文 从梦想到财富(28)如何成为顶尖高手
  19. js中的call和play
  20. python版本换行问题

热门文章

  1. 梅花雪js树形控件MZTreeVew1.0/MZTreeVew2.0下载
  2. 114284.鼹鼠隧道NEERC2016
  3. 大数据统计:发布近期网络辟谣TOP10,看看你信过几条?
  4. BJOI2020游记
  5. docker部署访问postgres数据库(一次到位)
  6. 丝雨学姐小灶班——Week 2
  7. java 中1%3c1%3c1_祥云杯2020 部分WriteUp
  8. 620道 Python开发工程师面试题合集
  9. LaTeX的RGB颜色笔记
  10. 我在犹太公司的15年