【数据结构】3.19
括号配对题 判断(){}[]的出现是否匹配 用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.在中')' '}' ']' 第一次出现时 栈不能是空的 防止 )()这样的情况