【问题描述】假设一算术表达式中包括三种括号:圆括号(和),方括号[和];,花括号{和};,且三种括号可按意 次序嵌套使用,试编写程序判定输入的表达式所含的括号是否正确配对出现(已知表达式已存入数据元素为字符的顺序表中)。若匹配,则返回1,否则返回0。
【输入形式】含括号的算数表达式
【输出形式】1/0
【样例输入】3+(44*[5-{6*[7*(45-10)]}])
【样例输出】1
【样例说明】判断括号是否匹配涉及两方面,括号个数和出现次序的判定。
代码:
#include<iostream>
/*
怎么去判断括号匹配呢?
那么就是左边的,如同(,[,{,这种就往堆栈里面放
,如果是右边的,如同),],},像这种的就要先去判断是否
这个堆栈的第一个字符知否和右边的匹配,如果是匹配的那么
就ok,但是如果不行的话,那么就是错的,直接退出
*/
using namespace std;
class Stack{
private:
char data[100];
int top;
public:
Stack();
void push(char a);
void pop();
bool isJudge(char a);
int gettop();
};
Stack::Stack()
{
top=0;
data[0]='#';
}
void Stack::push(char a)
{
top++;
data[top]=a;
}
bool Stack::isJudge(char a)
{
if(a==')')
{
if(data[top]=='(')
{
pop();
}
else
{
return false;
}
}
else if(a==']')
{
if(data[top]=='[')
{
pop();
}
else
{
return false;
}
}
else if(a=='}')
{
if(data[top]=='{')
{
pop();
}
else
{
return false;
}
}
else
{
push(a);
}
return true;
}
void Stack::pop()
{
top--;
}
int Stack::gettop()
{
return top;
}
int main()
{
Stack str;
int len;
bool flag=true;
char s[100];
cin>>s;
len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]=='('||s[i]==')'||s[i]=='['||s[i]==']'||s[i]=='{'||s[i]=='}')
{
flag=str.isJudge(s[i]);
if(flag==false)
{
break;
}
}
}
if(str.gettop()==0)
{
flag=1;
}
//判断flag的值来看怎么输出
if(flag==false)
{
cout<<'0'<<endl;
}
else
{
cout<<'1'<<endl;
}
return 0;
}