一、问题描述:
设计算法检测表达式的括号是否匹配
注:包括 () [] {}
二、解题思路:
栈的应用
例如:
5*(3+6)-[5-4*2+(1-5)] 括号匹配!
5*(3+6)-[5-4*2+(1-5) 括号不匹配!
)3+5( 括号不匹配!
({3+5}*2) 括号匹配!(小括号中可以嵌套方括号和大括号)
我们可以使用栈来解决此类问题
首先定义一个栈,栈初始化为空,当字符为左括号 ([{ 时,将字符进栈,
当遇到右括号 )]} 时,将栈中的字符出栈并与此右括号比较,若此括号匹配,即 当右括号为[时,栈中的括号为],否则匹配不成功;继续扫描下一个字符,当将字符全部扫描完并且栈为空说明括号匹配成功。
三、代码实现:
#include <iostream>
#include <string>
using namespace std;
int s[100],top=-1;
int bracketMatch(string str){
for(int i=0; str[i]!='\0'; i++){
if(str[i]=='('||str[i]=='['||str[i]=='{')
s[++top]=str[i]; //入栈
else{
switch(str[i]){
case ')':
if(s[top--]!='(') //出栈 并比较若不配对则说明括号不匹配
return 0;
else
break;
case ']':
if(s[top--]!='[')
return 0;
else
break;
case '}':
if(s[top--]!='{')
return 0;
}
}
}
if(top==-1) //字符都扫描完后,栈为空时说明括号匹配
return 1;
return 0;
}
int main(){
string str;
cin>>str;
int k=bracketMatch(str);
if(k==1)
cout<<"括号匹配"<<endl;
else
cout<<"括号不匹配"<<endl;
return 0;
}