//链栈的应用:括号匹配
#include <stdio.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#define sElemType int
typedef struct linkNode{
sElemType data;//数据域
linkNode *next;//指针域
}*linkStack;
//判空函数(链栈为空返回1;不为空返回0)
int isEmpty(linkStack top){
return top==NULL;
}
//初始化链栈
void initLinkStack(linkStack &top){
top=NULL;
}
//插入元素到链栈
void push(linkStack &top,sElemType val){
linkStack newNode=new linkNode[1];
newNode->data=val;
newNode->next=top;
top=newNode;
}
//删除链栈的栈顶元素
void pop(linkStack &top,sElemType &val){
if(isEmpty(top)){
return;
}
val=top->data;
linkStack tempPtr=top;
top=top->next;
delete tempPtr;
}
//判断字符是左括号还是右括号,左括号返回1;右括号返回0;其他返回2.
int leftOrRight(char c){
switch(c){
case'(':
case'[':
case'{':
return 1;
case')':
case']':
case'}':
return 0;
default:
return 2;
}
}
//单字符串括号匹配;如果匹配成功返回1;匹配失败返回0.
int isMatching(char left,char right){
if('('==left&&')'==right||'['==left&&']'==right||'{'==left&&'}'==right)
return 1;
else
return 0;
}
//整个字符串数组匹配;如果匹配成功返回1;匹配失败返回0.
int bracketMatch(char *str){
linkStack top;
initLinkStack(top);
int i=0;
while('\0'!=str[i]){
if(leftOrRight(str[i])==1){
push(top,str[i]);
//单字符串是左括号,将左括号压入栈中
}
if(leftOrRight(str[i])==0){
sElemType e;
if(isEmpty(top)==1){
//栈顶为空,说明有多余的右括号,即左括号少于右括号,匹配失败
return 0;
}
pop(top,e);//栈顶不为空且字符串是右括号,从栈顶弹出一个左括号
if(0==isMatching(e,str[i])) //一次匹配失败,则匹配失败
return 0;
}
i++;
}
if(isEmpty(top)==1){
//如果全部匹配完之后,栈顶为空,说明匹配成功;
return 1;
}else
//栈顶不为空,说明有多余的左括号,即左括号多于右括号
return 0;
}
int main(){
char str[100];
cin>>str;
if(bracketMatch(str)==1){
cout<<"括号匹配成功"<<endl;
}else{
cout<<"括号匹配失败"<<endl;
}
} 在这里插入代码片
左括号多于右括号,匹配失败:
右括号多于左括号,匹配失败:
括号匹配顺序错误,匹配失败:
括号匹配成功: