(2)括号匹配
括号类型:() []
匹配成功: (【】)、 【(【】【】)】
匹配失败:【(【】【)))、【)、【】)
//(2)括号匹配(顺序栈:问题:大小限制)
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef int Status;
typedef int SElemType;
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
void InitStack(SqStack &S)
{
S.base=new SElemType[MAXSIZE];
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=MAXSIZE;
}
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base==S.stacksize) return ERROR;
//先压后加
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}
int tran(char ch)
{
switch(ch)
{
case '(':return 1;break;
case '[':return 2;break;
case ')':return 3;break;
case ']':return 4;break;
}
}
int main()
{
SqStack S;
int find=1;
InitStack(S);//初始化
SElemType e;
string str;
cin>>str;
for(int i=0;i<str.length();i++)
{
int k=tran(str[i]);
if(k==1||k==2){
Push(S,k); //栈满的情况没考虑
}
else
{
if(!Pop(S,e)){ //栈空,前面没有左括号进行匹配,失败
find=0;
break;
}
// else Pop(S);
else{
if(e!=k-2){//匹配失败,重新入栈
Push(S,e);
}
}
}
}
if(find==0||(Pop(S,e)!=0))//find=0情况和循环出来栈不空的情况则匹配失败了
{
cout<<"匹配失败"<<endl;
}
else cout<<"匹配成功"<<endl;
return 0;
}