算法思想;
1)从左到右扫描字符串;
2)凡出现左括弧,则进栈;
3)凡出现右括弧,首先检查栈是否空; 若栈空,则表明该“右括弧”多余;否则和栈顶元素比较, 若相匹配,则左括弧出栈;否则表明不匹配
4)表达式检验结束时,若栈空,则表明表达式中匹配正确;否则表明“左括弧”有余
#include<iostream.h>
#include<iomanip>
typedef char ElemType;
//#include"a.h"
//#include"b.h"
typedef struct StackNode{
ElemType data;
struct StackNode *next;
}StackNode, *LinkStack;
LinkStack s,L;
ElemType e;
void InitStack(LinkStack &s)//构造一个空栈s,栈顶置空;
{
s=NULL;
}
void Push(LinkStack &s,ElemType e)//入栈,只能头插法;
{
LinkStack p=new StackNode;
p->data=e;
p->next=s;
s=p;
}
void Pop(LinkStack &s,ElemType &e)//出栈;
{
LinkStack p=new StackNode;
if(s==NULL)printf("输出格式错误\n");
e=s->data ;
p=s;s=s->next;
delete p;
}
int main()
{
while(1){
InitStack(s);InitStack(L);
int i,j;char str2[100];
cout<<"输入一段表达式:";
cin>>str2;
for(j=0;j<strlen(str2);j++)
{
e=str2[j];
if(e=='['||e=='('||e=='{')Push(s,e);
if(e==')'){if(s==NULL){cout<<"右括号多余"<<endl;goto a;}else {if(s->data =='(')Pop(s,e);else {cout<<"括号不匹配"<<endl;goto a;}}}
if(e==']'){if(s==NULL){cout<<"右括号多余"<<endl;goto a;}else {if(s->data =='[')Pop(s,e);else {cout<<"括号不匹配"<<endl;goto a;}}}
if(e=='}'){if(s==NULL){cout<<"右括号多余"<<endl;goto a;}else {if(s->data =='{')Pop(s,e);else {cout<<"括号不匹配"<<endl;goto a;}}}
}
if(s==NULL)cout<<"括号匹配成功"<<endl;
else cout<<"左括号多余"<<endl;
a:;
}
return 0;
}