假设一个算术表达式中包含圆括号、方括号两种类型的括号,试编写一个判断表达式中括号是否匹配的程序,匹配返回
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;
}//InitStack
int EmptyStack(SqStack &S)
{
// SqStack S;
if(S.base==S.top)
return 1;
else
return 0;
}//judge S is empty
void 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;
}//Push
void Pop(SqStack &S,int &e)
{
// SqStack S;
// int e;
if(S.top!=S.base)
e = * --S.top;
}//Pop
int 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");
}