C数据结构学习历程(4) 链栈之 括号匹配

来源:互联网 发布:短域名生成腾讯 编辑:程序博客网 时间:2024/05/02 05:01

我是参照《严蔚敏数据结构ppt》http://wenku.baidu.com/view/3ff16fc20242a8956aece41d.html以及《严蔚敏c数据结构视频》来写的,因为ppt上有些错,而视频上的代码不全,自己另写了。ppt上错哪,我就不指出了,大家可以对照着看,就能发现不同之处。

因为有注释,我直接copy代码了。也参考了关联的文章   “数据结构实验之栈四:括号匹配

#include<iostream>using namespace std;#define OK 1#define ERROR -1#define MAX_SIZE 100typedef int Status; typedef char ElemType;typedef struct Stack_Node    //链栈的结点类型说明{ElemType data;struct Stack_Node *next;}StackNode;StackNode *Init_Link_Stack(){StackNode * top;top=(StackNode *)malloc(sizeof(StackNode));top->next=NULL;return (top);}void push(StackNode *top,ElemType e){StackNode *p;p=(StackNode*)malloc(sizeof(StackNode));p->data=e;p->next=top->next;top->next=p;}ElemType pop(StackNode*top){if(top->next==NULL) {cout<<"为空时,不能弹出"<<endl;return -1;}//ElemType e=top->data ;          //不能这样,因为top是为空栈的StackNode *p=top->next;ElemType e=p->data ;top->next=p->next;free(p);return e;}ElemType getTop(StackNode *top){return top->next->data;}void judge(char a[])    // 给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。{int len=strlen(a);  //遇到的第一个\0int i;StackNode *stack=Init_Link_Stack();for( i=0;i<len;i++){if(a[i]=='('||a[i]=='['||a[i]=='{'){push(stack,a[i]);}if(a[i]!=')'&&a[i]!=']'&&a[i]!='}')  //输入的不是括号   continue;if(stack->next==NULL)//有了右半个括号,但是没有左半个括号的情况,因为不能获取最上的数据了,{cout<<"no"<<endl;break;}if(a[i]-getTop(stack)==1||a[i]-getTop(stack)==2)  //a[i]为3种情况,只要与最上匹配都行的。小括号相差1,大括号与中括号相差2{pop(stack);}else {cout<<"no"<<endl;break;}}if(i==len){if(stack->next==NULL){cout<<"yes"<<endl;}}}int main(){char *a1="a+(b*c+{(d-3)]})";char a[7]={'a','+','(','b','*','c',')'};judge(a1);return 0;}



1 0
原创粉丝点击