习题3-4 括号匹配检验
假设一个算术表达式中可以包含三种括号:圆括号“(”和“)” 、方圆括号“[”和“]”、和花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法。若正确配对则输出yes,否则输出no。注意,算术表达式可能没有括号,也可能不合法(不需要判断)。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据输入不超过50个字符的算术表达式。
输出格式:
对于每组测试,根据算术表达式中的括号是否正确配对输出“yes”或“no”。引号不必输出。
输入样例:
a*[b+c*{d-e}+56-[78]9]+[310]+518(3e)+5
3-[4+c{9-5}+a6-[de]+3
输出样例:
yes
no
#include<iostream>
using namespace std;
typedef float ElemType;
struct stackNode{
ElemType data;
stackNode *next;
};
class Stack{
public:
ElemType Top();
void Pop();
void Push(ElemType);
void InitStack();
bool Empty();
void Clear();
private:
stackNode *top;
};
void Stack::InitStack()
{
this->top = new stackNode();
top->next=NULL;
}
ElemType Stack::Top()
{
if(!this->Empty()){
return top->next->data;
}
return ' ';
}
void Stack::Pop()
{
stackNode *p=top->next;
if(!this->Empty()){
top->next=top->next->next;
free(p);
}
}
void Stack::Push(ElemType data){
stackNode *p = new stackNode();
p->data=data;
p->next=top->next;
top->next=p;
}
bool Stack::Empty(){
if(top->next!=NULL){
return false;
}
return true;
}
void Stack::Clear(){
stackNode *p;
while(top->next!=NULL){
p=top->next;
top->next=p->next;
free(p);
}
}
int main()
{
int flag=0;
string str,opt;
Stack khStack;
khStack.InitStack();
string hz;
while(cin>>str){
hz="";
int flag=1;
for(int i=0;i<str.size();i++){
if(str[i]=='('||str[i]=='{'||str[i]=='['){
khStack.Push(str[i]);
flag=1;
}else if(str[i]==')'||str[i]=='}'||str[i]==']'){
if(!khStack.Empty()){
if(str[i]==')'&&khStack.Top()=='('){
khStack.Pop();
}else if(str[i]=='}'&&khStack.Top()=='{'){
khStack.Pop();
}else if(str[i]==']'&&khStack.Top()=='['){
khStack.Pop();
}else{
flag=0;
break;
}
}else{
flag=0;
break;
}
}
}
if(flag==0||!khStack.Empty()){
cout<<"no"<<endl;
}else{
cout<<"yes"<<endl;
}
}
}
解题思路
从前往后遇到{([就入栈,遇到}])就判断栈是否有相匹配的括号,有就出栈,没有就退出循环flag=0,栈空也flag=0,结束时栈不为空flag=0,最后flag=0输出no,否则输出1;
题目有问题,我不太理解算术表达式可能没有括号,也可能不合法(不需要判断)
这句话,如果没括号的话,就是说他是不合法的,那么应该输出no,可是样例说要输出yes,奇怪。