任务
假设一个表达式有英文字母(大、小写)、数字、四则运算符(+,-,*,/)和左右小括号、中括号、大括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右大中小括号是否匹配,若匹配,则返回“Yes”;否则返回“No”。(禁止使用 STL 库,包括 string 头文件)
输入格式
输入文件中第一行是表达式数目 N
之后是需要进行括号配对检测的 N 个表达式。
输出格式
N 行输出分别对应输入的 N 行表达式,每行都为“Yes”或“No"
源代码
链栈基本操作
#include<iostream>
using namespace std;
typedef struct StackList{
char ope; //储存括号的链栈节点
struct StackList* next;
}Stack;
Stack* PushStack(Stack** S,char c){//将括号进栈
Stack *p=(Stack*)malloc(sizeof(Stack));
if(!p){
printf("申请空间失败");
return NULL;
}
p->ope=c;
if(!*S){
*S=p;
(*S)->next=NULL;
}
else{
p->next=*S;
*S=p;
}
return *S;
}
char PopStack(Stack** S){//将栈顶括号出栈
char c;
if(!*S){
printf("链栈为空");
return 0;
}
Stack *p=*S;
c=p->ope;
(*S)=(*S)->next;
free(p);
return c;
}
char GetStackTop(Stack* S){//取栈顶括号
if(!S)
return -1;
return S->ope;
}
检验括号是否匹配
int BracketTest(char* a){//检验括号是否匹配
int i=0;
Stack* S=NULL;
char x;
while(a[i]&&a[i]!='@'){
switch (a[i]) {
case '(':
case '[':
case '{':
PushStack(&S,a[i]);
i++;
break;
case ')':{
if(!S)
return 0;
char c1=PopStack(&S);
if(c1=='['||c1=='{')
return 0;
i++;
break;
}
case ']':{
if(!S)
return 0;
char c2=PopStack(&S);
if(c2=='{'||c2=='('||(GetStackTop(S)&&GetStackTop(S)=='('))//判断优先级
return 0;
i++;
break;
}
case '}':{
if(!S)
return 0;
char c3=PopStack(&S);
if(c3=='('||c3=='['||(GetStackTop(S)&&(GetStackTop(S)=='('||GetStackTop(S)=='[')))
return 0;
i++;
break;
}
default:{
i++;
break;
}
}
}
if(S)
return 0;
return 1;
}
主函数输入输出
int main(){
int n,i;
cin>>n;
char st[20][20];
for(i=0;i<n;i++)
cin>>st[i];
for(i=0;i<n;i++){
if(BracketTest(st[i]))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}