括号配对题 判断(){}[]的出现是否匹配 用Stack实现
#include<iostream> #include <stdlib.h> using namespace std; typedef int Status; const int TRUE=1; const int FALSE=0; const int OK=1; const int ERROR=0; const int INFEASIBLE=-1; const int overflow=-2; const int STACK_INIT_SIZE=100; const int STACKINCREMENT=10; typedef struct{ char orinal; char match; }Bracket; typedef struct{ Bracket *base; Bracket *top; int stacksize; }SqStack; //构造一个空栈 Status InitStack(SqStack &S) { S.base=(Bracket*)malloc(sizeof(Bracket)*STACK_INIT_SIZE); if(!S.base) exit(overflow); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } Status GetTop(SqStack S,Bracket &e) { if(S.top==S.base) return ERROR; e=*(S.top-1); return OK; } Status Push(SqStack &S,Bracket e) { if(S.top-S.base>=S.stacksize) { S.base=(Bracket*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(Bracket)); if(!S.base)exit(overflow); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; return OK; } Status Pop(SqStack &S,Bracket &e) { if(S.top==S.base) return ERROR; e=*--S.top; return OK; } Status StackEmpty(SqStack S){ if(S.base==S.top) return TRUE; else return FALSE; }
#include"exercise3_19.h"
Status BracketMatch(char* input,int length)
{
Bracket bracket1;
Bracket bracket2;
Bracket bracket3;
bracket1.orinal='(';
bracket1.match=')';
bracket2.orinal='[';
bracket2.match=']';
bracket3.orinal='{';
bracket3.match='}';
SqStack S;
InitStack(S);
for(int i=0; i<length;i++)
{
char tmp=*(input+i);
printf("%c",tmp);
switch(tmp)
{
case '{':
{
Push(S,bracket3);
break;
}
case '[':
{
Push(S,bracket2);
break;
}
case '(':
{
Push(S,bracket1);
break;
}
case ')':
case ']':
case '}':
{
if(StackEmpty(S))
{
printf("error");
return ERROR;
}
else
{
Bracket tmp2;
GetTop(S,tmp2);
if(tmp==tmp2.match)
{
Pop(S,tmp2);
}
else
{
printf("error");
return ERROR;
}
}
break;
}
default:
break;
}
}
if(!StackEmpty(S))
{
printf("error");
return ERROR;
}
printf("correct");
return OK;
}
void main()
{
char p[30]="3*(5+2+(2)+{[()]}){}}";
BracketMatch(p,30);
getchar();
}
关键点:
1.定义了Bracket类型 使得可以直接根据栈中的元素判断是否配对
2.switch 语句中')' '}' ']' 统一处理 '{' '[' '(' 分开处理
3.别忘记switch 的 break default
4.整个过程结束后 栈必须是空的 防止 ()(这样的情况
5.在中')' '}' ']' 第一次出现时 栈不能是空的 防止 )()这样的情况