括号匹配
描述
假设表达式中允许包含圆括号和方括号两种括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。本题的任务是检验一个给定表达式中的括号是否正确匹配。输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“OK”,不匹配就输出“Wrong”。
输入
一行字符,只含有圆括号和方括号,个数小于 255。
输出
匹配就输出一行文本“OK”,不匹配就输出一行文本“Wrong”。
输入样例 1
[(])
输出样例 1
Wrong
对于此问题,我用的是最为传统的栈思想。手写栈的好处有很多,便于修改或便于添加,所以这里我选择的是手写栈。
先来简单介绍一些思路:
假设有括号:( [ ) ]
先进行设栈,这里就用 a 来进行。再写入括号。
最重要的一步来了:进行判断。
字符s:( [ ) ]
下标i: 0123
设i为下标,从0到3遍历。
若s[i]是 “(” 或是 “[” 就无条件压入栈a,将栈a下标++top。
若s[i]是 “)” 就判断。若a[top]==“(”,则将top--。(下次++top就会覆盖掉 “)”) 。
若a[top]!="(",则将记录的f(原为0)为1,直接break。
若s[i]是 “]” 就判断。若a[top]==“[”,则将top--。(下次++top就会覆盖掉“[”) 。
若a[top]!="[",则将记录的f为1,直接break。
循环结束。
最后判断:
若 f 为 1,则输出Wrong。
若 f 为 0,则输出OK。
完成
附上代码:
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int main(){
string a[260];
int top=-1;
string s;
cin>>s;
int f=0;
for(int i=0;i<s.size();i++){
if(s[i]=='(' || s[i]=='['){
a[++top]=s[i];
}
if(s[i]==')'){
if(a[top]=="("){
top--;
}else{
f=1;
break;
}
}
if(s[i]==']'){
if(a[top]=="["){
top--;
}else{
f=1;
break;
}
}
}
if(f==1){
cout<<"Wrong";
return 0;
}
if(f==0){
cout<<"OK";
}
return 0;
}
如果有更好的思路,欢迎留言!!