7-17 括号匹配(30 分)
给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。
输入格式:
输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。
输出格式:
如果括号配对,输出yes,否则输出no。
输入样例1:
sin(10+20)
输出样例1:
yes
输入样例2:
{[}]
输出样例2:
no
源代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
string a;
stack<char>st;
getline(cin,a);
int yon=1;
for(int i=0; i<a.length(); i++) {
if(a[i]=='('||a[i]=='['||a[i]=='{') {
char t=a[i];
st.push(t);
} else if(a[i]==']'||a[i]==')'||a[i]=='}') {
if(!st.empty()){
if(a[i]==')') {
char ch=st.top();
st.pop();
if(ch=='(');
else yon=0;
} else if(a[i]==']') {
char ch=st.top();
st.pop();
if(ch=='[');
else yon=0;
} else if(a[i]=='}') {
char ch=st.top();
st.pop();
if(ch=='{');
else yon=0;
}
} else {
yon=0;
break;
}
}
}
if(yon&&st.empty())cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
大体思路:这题是栈操作的经典问题,
在遍历字符串时,
遇见左括号则入栈,
遇见右括号则判断栈是否为空,
不为空则弹出栈顶进行比对,
如果配对则不作处理,
不配对则将标记赋0,跳出
为空则将标记赋0,跳出
输出时判断标记是否为真且栈是否为空
重点:这题的坑在于你在遇见右括号时不能直接弹出栈顶,因为栈可能为空,这样就造成了段错误,所以应该加一个判断栈顶是否为空的条件