版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
判断一组括号是否是左右括号相匹配
用栈存储,输入左括号入栈,等待与之相匹配的右括号,输入相应的右括号,将左括号出栈。最后,如果栈是空栈则匹配成功,否则匹配失败。
栈的结构体定义
typedef struct TagStack{
char List[MAXSIZE];
int top;
int base;
}Stack,*LinkStack;
栈的初始化
void InitStack(LinkStack &S){
S=new Stack;
S->top=0;
S->base=0;
}
左括号入栈
case '(':{//判断是左括号,ch入栈
S->List[S->top+1]=ch;//ch入栈
S->top++;//栈顶指针后移
break;
}
case '{':{//判断是左括号,ch入栈
S->List[S->top+1]=ch;//ch入栈
S->top++;//栈顶指针后移
break;
}
右括号匹配
case ')':{//判断是右括号,出栈并判断是否匹配成功
if (S->top!=0){//栈非空
if (S->List[1]=='('){//匹配成功
while(S->top>0){//出栈
S->top--;
}
}
}
else return 1;//栈空,入栈右括号,结果一定匹配不成功
break;
}
case '}':{//判断是右括号,出栈并判断是否匹配成功
if (S->top!=0){//栈非空
if (S->List[1]=='{'){//匹配成功
while(S->top>0){//出栈
S->top--;
}
}
}
else return 1;//栈空,入栈右括号,结果一定匹配不成功
break;
}
源代码
#include <iostream>
using namespace std;
#include <stdlib.h>
#define MAXSIZE 20
typedef struct TagStack{
char List[MAXSIZE];
int top;
int base;
}Stack,*LinkStack;
void InitStack(LinkStack &S){
S=new Stack;
S->top=0;
S->base=0;
}
int Matching(LinkStack &S){
char ch;
cout<<"请输入表达式,以#结束:";
do {
cin>>ch;
switch(ch){
case '(':{//判断是左括号,ch入栈
S->List[S->top+1]=ch;//ch入栈
S->top++;//栈顶指针后移
break;
}
case '{':{//判断是左括号,ch入栈
S->List[S->top+1]=ch;//ch入栈
S->top++;//栈顶指针后移
break;
}
case ')':{//判断是右括号,出栈并判断是否匹配成功
if (S->top!=0){//栈非空
if (S->List[1]=='('){//匹配成功
while(S->top>0){//出栈
S->top--;
}
}
}
else return 1;//栈空,入栈右括号,结果一定匹配不成功
break;
}
case '}':{//判断是右括号,出栈并判断是否匹配成功
if (S->top!=0){//栈非空
if (S->List[1]=='{'){//匹配成功
while(S->top>0){//出栈
S->top--;
}
}
}
else return 1;//栈空,入栈右括号,结果一定匹配不成功
break;
}
}
} while (ch!='#');
return S->top;
}
void main(){
int flag;
LinkStack S;
InitStack(S);
flag=Matching(S);
if (flag==1){
cout<<"栈中元素个数:"<<flag<<endl<<"匹配失败!"<<endl;
}
else if(flag==0){
cout<<"栈中元素个数:"<<flag<<endl<<"匹配成功!"<<endl;
}
system("pause");
}