广义表的建立与求深度

来源:互联网 发布:废除网络中立 编辑:程序博客网 时间:2024/05/21 06:59

广义表是一种比较复杂的线性表,它的原子要么是元素,要么是子表,表中除了表头元素以外其他全是表尾,所以表尾一定是子表类型。

时限:1000ms 内存限制:10000K  总时限:3000ms

描述
按表头、表尾的分析方法重写求广义表深度的递归算法
 
输入
输入一串以'('开始,以')'结束的字符串,并且输入的左右括号必须匹配,如:(),(())..
 
输出
分别输出按表头、表尾分析方法求广义表深度的结果,每个结果占一行。
 
输入样例
((a,b,(c,(d,e),f)),g)
 
输出样例
4
 
提示

只要抓住了广义表的特点,分析清楚括号的位置,其实不难实现

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <algorithm>typedef struct GListNode{int tag;GListNode *head, *tail;char data;}Node, *PNode;typedef struct MyString{char str[102];int length;}MyString;MyString GetHead(MyString s){int i, begin, end, point, level;MyString head;begin = 1;point = begin;if (s.str[1] == '('){level = 1;}else{level = 0;}if (s.str[1] == '('&&s.str[2] == ')'){head.length = 0;head.str[0] = '\0';return head;}while (level > 0){point++;if (s.str[point] == '('){level++;}else if (s.str[point] == ')'){level--;}}//whileend = point;head.length = end - begin + 1;for (i = begin; i <= end; i++){head.str[i - 1] = s.str[i];}head.str[i-1] = '\0';return head;}MyString GetTail(MyString s){int point,level,i,k;MyString tail;point = 1;if (s.str[point] == '('){level = 1;}else{level = 0;}while (level > 0){point++;if (s.str[point] == '('){level++;}else if (s.str[point] == ')'){level--;}}//whilepoint = point + 2;if (point >= s.length){tail.length = 0;tail.str[0] = '\0';return tail;}tail.str[0] = '(';k = 1;for (i = point; i <= s.length - 1; i++){tail.str[k] = s.str[i];k++;}tail.str[k] = '\0';tail.length = s.length - point + 1;return tail;}PNode CreatGList(MyString s){PNode n;MyString shead, stail;n = (PNode)malloc(sizeof(Node));if (s.length == 1){n->tag = 0;n->data = s.str[0];n->head = NULL;n->tail = NULL;}else{n->tag = 1;shead = GetHead(s);stail = GetTail(s);if (shead.length == 0){n->head = NULL;}else{n->head = CreatGList(shead);}if (stail.length == 0){n->tail = NULL;}else{n->tail = CreatGList(stail);}}return n;}int CountLayer(PNode n){if (n == NULL){return 0;}else{return (std::max(CountLayer(n->head) + 1, CountLayer(n->tail)));}}int main(){int ans;PNode p;MyString s;scanf("%s", s.str);s.length = strlen(s.str);p = (PNode)malloc(sizeof(Node));p = CreatGList(s);ans = CountLayer(p);printf("%d\n%d\n", ans-1,ans-1);return 0;}

0 0
原创粉丝点击