#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef enum{ATOM, LIST}ElemType;
typedef struct GLNode{
ElemType tag;
union{
char atom;
struct{
struct GLNode *hp,*tp;
}htp;
}atom_htp;
}GLNode;
char s[1000];
void Process(char *str, int len, char ** str1, int *len1, char ** str2, int *len2)
{
int cnt = 0;
int a = 0;
for(int i = 0; i < len; i++)
{
if(str[i]=='(')
cnt++;
if(str[i]==')')
cnt--;
if(cnt == 0 && str[i]==',')
break;
a++;
}
if(a == len)
{
(*str1) = str;
*len1 = a;
(*str2) = NULL;
*len2 = 0;
}
else
{
(*str1) = str;
*len1 = a;
(*str2) = str+a+1;
*len2 = len - a- 1;
}
}
void Create(GLNode **G, char *str, int len)
{
if(len==0) *G = NULL;
else if(len==1)
{
*G = (GLNode *)malloc(sizeof(GLNode));
(*G)->tag = ATOM;
(*G)->atom_htp.atom = str[0];
}
else
{
*G = (GLNode *)malloc(sizeof(GLNode));
(*G)->tag = LIST;
GLNode * p = *G, *q;
char *str1, *str2, *str3;
int len1, len2, len3;//一是当前处理的,二是剩下的,三是起临时作用的
{//脱去括号
str = str + 1;
len = len -2;
}
str2 = str;
len2 = len;
do
{
str3 = str2;
len3 = len2;
Process(str3, len3, &str1, &len1, &str2, &len2);
Create(&(p->atom_htp.htp.hp), str1,len1);
if(len2 != 0)
{
q = (GLNode *)malloc(sizeof(GLNode));
q->tag = LIST;
p->atom_htp.htp.tp = q;
p = q;
}
}while(len2!=0);
p->atom_htp.htp.tp = NULL; } }
int GetHeighth(GLNode* G)
{
int max = -1;
int n;
if(!G)
return 1;
if(G->tag==ATOM)
return 0;
GLNode *p = G;
while(p)
{
n = GetHeighth(p->atom_htp.htp.hp);
max = n>max?n:max;
p = p->atom_htp.htp.tp;
}
return max + 1;
}
int main()
{
scanf("%s",s);
GLNode * G;
Create(&G,s, strlen(s));
int ret = GetHeighth(G);
printf("%d\n%d",ret,ret);
return 0;
}

求广义表深度(严5.30)--------西工大noj的更多相关文章

  1. 广义表操作 (ava实现)——广义表深度、广义表长度、打印广义表信息

    广义表是对线性表的扩展——线性表存储的所有的数据都是原子的(一个数或者不可分割的结构),且所有的数据类型相同.而广义表是允许线性表容纳自身结构的数据结构. 广义表定义: 广义表是由n个元素组成的序列: ...

  2. K阶斐波那契数列--------西工大NOJ习题.10

    K阶斐波那契数列--------西工大NOJ习题.10 原创不易,转载请说明出处!!! 科普:k阶斐波那契数列的0到n-1项需要有初始值. 其中,0到n-2项初始化为0,第n-1项初始化为1. 在这道 ...

  3. 循环队列(严3.30)--------西工大NOJ习题.9

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> typedef struct _Q ...

  4. 二叉排序树的合并(严3.98)--------西工大noj

    二叉排序树的合并有三种方法 先存入数组,然后..... 直接在第二个树上添加第一个数的元素,时间复杂度为O(NlogN) 就像是合并数组一样合并二叉排序树,分别扫描,时间复杂度极低. 第三种我写了一下 ...

  5. 输出以二叉树表示的算术表达式(严6.51)--------西工大noj

    题解 这道题目说的很诡异,其实没有什么把括号补上....仅仅是先序读入,然后中序输出就行了 代码 #include <stdio.h> #include <stdlib.h> ...

  6. 建立二叉树的二叉链表(严6.65)--------西工大noj

    需要注意的点:在创建二叉树的函数中,如果len1==len2==0,一定要把(*T)置为NULL然后退出循环 #include <stdio.h> #include <stdlib. ...

  7. 建立二叉树的二叉链表存储结构(严6.70)--------西工大noj

    #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TreeNode ...

  8. 以十字链表为存储结构实现矩阵相加(严5.27)--------西工大noj

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> typedef int ElemT ...

  9. 基于图的广度优先搜索策略(耿7.11)--------西工大noj.20

    目录 代码 代码 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct ...

随机推荐

  1. Kubernetes 的这些原理,你一定要了解

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 作者:fredalxin地址:https://freda ...

  2. 如何查看Linux进程详情?(ps命令)

    点击关注上方"开源Linux", 后台回复"读书",有我为您特别筛选书籍资料~ 1. ps是什么? 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是 ...

  3. java高级用法之:JNA中的Memory和Pointer

    目录 简介 Pointer 特殊的Pointer:Opaque Memory 总结 简介 我们知道在native的代码中有很多指针,这些指针在JNA中被映射成为Pointer.除了Pointer之外, ...

  4. 数据库、MySQL下载与安装、基本SQL语句

    数据演变史 # 1.单独的文本文件 没有固定的存放位置 没有固定的数据格式 '''程序彼此无法兼容 没有统一的标准''' # 2.软件开发目录规范 按照文件功能的不同规定了相应的位置 '''文件查找变 ...

  5. Fuzzing101系列 Exercise 1 - Xpdf

    序言 Fuzzing101系列包含针对10 个真实目标的10个练习,在练习中一步一步学习Fuzzing技术的知识. 模糊测试(Fuzzing/Fuzz)是一种自动化软件测试技术,它基于为程序提供随机或 ...

  6. 注意:Spring Boot 2.7开始spring.factories不推荐使用了,接下来这么玩...

    如果你是Spring Boot用户的话,一定有这样的开发体验,当我们要引入某个功能的时候,只需要在maven或gradle的配置中直接引入对应的Starter,马上就可以使用了,而不需要像传统Spri ...

  7. Hadoop入门学习笔记(一)

    Week2 学习笔记 Hadoop核心组件 Hadoop HDFS(分布式文件存储系统):解决海量数据存储 Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度 Hadoop Map ...

  8. 专家PID控制仿真学习

    目录 专家控制 专家系统 专家控制 学习笔记,用于记录学习 资料:<智能控制>(第四版)--刘金琨 专家系统 一.专家系统的定义 专家系统是一类包含知识和推理的智能计算机程序,其内部包含某 ...

  9. npm init cabloy背后的故事

    背景 我们知道许多框架会提供一个脚手架工具,我们先下载安装脚手架工具,然后再通过脚手架命令行来创建项目.在npm@6.1.0中引入了npm init <initializer>的语法.简单 ...

  10. conda创建/移除虚拟环境

    conda创建python虚拟环境 前言 conda常用的命令: conda list 查看安装了哪些包. conda env list 或 conda info -e 查看当前存在哪些虚拟环境 co ...