从键盘读入一个字符串,其中只含有() {} [ ] ,判断该字符串中的每种括号是否成对出现。
提示:可借助栈来实现,括号必须配对出现,如()[ ]{},这是匹配的括号,如([{])},这是不匹配的括号(中间无空格)。
输入一个字符串(中间不包含空格)
匹配输出yes,否则输出no
思路:
1. 括号匹配的四种可能性:
①左右括号配对次序不正确 ②右括号多于左括号 ③左括号多于右括号 ④左右括号匹配正确 2. 算法思想: 1.顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈; 2.当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断; 3.若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确,匹配失败,直接退出; 4.若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号,匹配失败,直接退出; 5.字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号,匹配失败;6.正常结束则括号匹配正确。
#include <iostream> #include <cstring> #include <stack> using namespace std; int main() { stack<char>a; int flag=1,i; char ch[100]; cin>>ch; for(i=0;i<strlen(ch);i++){ if(ch[i]=='{'||ch[i]=='('||ch[i]=='[') a.push(ch[i]); else{ if(a.empty()==true){ flag=0; break; } else if((ch[i]=='}'&&a.top()=='{')||(ch[i]==')'&&a.top()=='(')||(ch[i]==']'&&a.top()=='[')) a.pop(); else{ flag = 0; break; } } } if(flag==0) cout<<"no"; else cout<<"yes"; }
