【问题描述】
一个表达式中包含两种括号,( ) [ ] ,且这两种括号可以按照任意次序嵌套使用。判别括号是否正确配对出现。
(1)扫描表达式,
(2)如果是左括号则入栈,继续扫描
(3)如果是右括号则 弹出栈顶括号 与当前右括号判断是否匹配;若匹配则继续扫描,否则返回匹配不正确,不再扫描;
(4)扫描完成后若栈为空则正确配对,否则不正确。
【样例输入1】 9+(7-3)*[9/(8-5)]#
【样例输出1】 ok
【样例输入2】 )9+(7-3)*[9/(8-5)]#
【样例输出2】 error
【样例说明】表达式内的数据项可都定义为字符型,表达式以#代表结束,
#include
#include
#define OK 1
#define ERROR 0
using namespace std;
typedef struct Stacknode
{
char data;
struct Stacknode *next;
}Stacknode,*Linkstack;
int Initstack(Linkstack &s)
{
s=NULL;
return OK;
}
int push(Linkstack &s,char x)
{
Linkstack p;
p=(Stacknode*)malloc(sizeof(Stacknode));
p->data=x;
p->next=s;
s=p;
return OK;
}
int pop(Linkstack &s,char x)
{
if(s==NULL)
return ERROR;
else if((x==')'&&s->data=='(')||(x==']'&&s->data=='['))
{
Linkstack p;
p=(Stacknode*)malloc(sizeof(Stacknode));
p=s;
s=s->next;
delete p;
return OK;
}
return 0;
}
int match(Linkstack s)
{
char x;
cin>>x;
if(x=='#')
cout<<"ok";
else
{
while(x!='#')
{
if(x=='('||x=='[')
push(s,x);
else if(x==')'||x==']')
pop(s,x);
cin>>x;
}
if(OK==pop(s,x))
cout<<"ok";
else
cout<<"error";
}
return 0;
}
int main()
{
Linkstack s;
Initstack(s);
match(s);
return 0;
}
提交的测试结果如下图所示