/*
括号匹配问题,利用链式栈实现
2018.04.17
*/
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef struct StackNode{
char data;
struct StackNode *next;
}StackNode,*LinkStack;
//初始化
Status InitStack(LinkStack &S){
S=NULL;
return OK;
}
//入栈
Status Pop(LinkStack &S,char str){
LinkStack p=new StackNode;
if(p==NULL)
return ERROR;
p->data=str;
p->next=S;
S=p;
return OK;
}
//出栈
Status Push(LinkStack &S,char &str){
if(S==NULL)
return ERROR;
LinkStack p=S;
str=S->data;
S=S->next;
delete p;
return OK;
}
//判断栈是否为空,真为空,假为非空
Status StackEmpty(LinkStack S){
if(S==NULL)
return OK;
return ERROR;
}
//判断是否匹配
Status Match(char str1,char str2){
switch(str1){
case '[':
if(str2==']')
return OK;
else
return ERROR;
break;
case '(':
if(str2==')')
return OK;
else
return ERROR;
break;
case '{':
if(str2=='}')
return OK;
else
return ERROR;
default:
cout<<str1<<" "<<str2<<endl;
cout<<"ERROR Input!"<<endl;
exit(0);
}
}
int main(){
LinkStack S=new StackNode;
char str[50];
char tmp;
cout<<"Please input str:";
gets(str);
int len=strlen(str);
for(int i=0;i<len;++i){
switch (str[i]){
case '(':
case '[':
case '{':
Pop(S,str[i]);
break;
case ')':
case ']':
case '}':
if(StackEmpty(S)==OK){
cout<<"右括号多余,请检查!"<<endl;
return 0;
}
else{
Push(S,tmp);
if(Match(tmp,str[i])==OK)
cout<<tmp<<"与"<<str[i]<<"匹配成功!"<<endl;
else{
cout<<"匹配失败!"<<endl;
return 0;
}
}
break;
}
}
if(StackEmpty(S)!=OK)
cout<<"左括号多余,请检查!"<<endl;
else
cout<<"匹配成功!"<<endl;
return 0;
}
数据结构——栈的利用:括号匹配问题
最新推荐文章于 2024-12-24 11:37:20 发布