3.括号匹配

来源:互联网 发布:创业方向 知乎 编辑:程序博客网 时间:2024/06/07 05:41
假设一个算术表达式中包含圆括号、方括号两种类型的括号,试编写一个判断表达式中括号是否匹配的程序,匹配返回Match succeed!,否则返回Match false!

[1+2*(3+4*(5+6))]括号匹配

(1+2)*(1+2*[(1+2)+3)括号不匹配

输入

包含圆括号、方括号两种类型括号的算术表达式

输出

匹配输出Match succeed!

不匹配输出Match false!

输入[1+2* (3+4*(5+6))]

输出Match succeed!


测试用例1:
输入:[1+2*(3+4*(5+6))]↵
输出:Match succeed!↵
测试用例2 :
输入:(1+2)*(1+2*[(1+2)+3)↵
输出:
Match false!↵

个人做题时出现的问题:
1.刚开始是选错了提交的编译器,因为函数参数传递时用到了&,这是C++的引用的用法,就是给参数取了个别名的意思;而&在C里面是取地址的操作,对于有几个函数需要进行参数传递时,用C++的&比用C里面的指针的操作要简便很多。
2.改正了第一个错误后,提交后部分不能通过,调试发现参数e的一直一直未0,与书上的几个函数参数引用形式比较才发现,是Pop(&S,&e)而不是Pop(&S,e).看来对个数据结构基本操作的具体形式还是要理解透记清楚。

//括号内引用问题一定要记清楚,Pop里面的参数e就是要引用操作,切记!!! #include<stdio.h>#include<stdlib.h>#include<malloc.h> #define S_size 100#define StackIncreament 10 typedef struct SqStack{int *base;int *top;int stacksize;}SqStack;void InitStack(SqStack &S){S.base = (int *)malloc(S_size*sizeof(int));if(S.base)S.top = S.base;S.stacksize = S_size;}//InitStackint EmptyStack(SqStack &S){//SqStack S;if(S.base==S.top)  return 1;else  return 0;}//judge S is emptyvoid Push(SqStack &S,int e){//SqStack S;//int e;if((S.top-S.base)>S.stacksize){S.base=(int *)realloc(S.base,(S.stacksize+StackIncreament)*sizeof(int));if(S.base) S.top=S.base+S.stacksize;S.stacksize+=StackIncreament;}*S.top ++ = e;}//Pushvoid Pop(SqStack &S,int &e){//SqStack S;//int e;if(S.top!=S.base)e = * --S.top;}//Popint main(){SqStack S;InitStack(S);char ch[100],*p;int e;p=ch;gets(ch);while(*p){switch(*p){case '(':Push(S,*p++);break;case '[':Push(S,*p++);break;case '{':Push(S,*p++);break;case ')':{         Pop(S,e);         if((e=='('&&*p==')')||(e=='{'&&*p=='}')||(e=='['&&*p==']'))               p++;         else            {printf("Match false!\n");exit(0);}}         break;case ']':{         Pop(S,e);         if((e=='('&&*p==')')||(e=='{'&&*p=='}')||(e=='['&&*p==']'))               p++;         else            {printf("Match false!\n");exit(0);}}         break;case '}':{         Pop(S,e);         if((e=='('&&*p==')')||(e=='{'&&*p=='}')||(e=='['&&*p==']'))               p++;         else            {printf("Match false!\n");exit(0);}}         break;default:p++; }}if(EmptyStack(S))  printf("Match succeed!\n");else  printf("Match false!\n");}


0 0