括号匹配问题 栈C++ 利用stl库
1. 题目
利用栈来判断括号是否匹配,不限次数地输入,匹配则输出“True”,不匹配就输出“False”。
2. 解析
- 碰上左边括号压入栈,碰上右边括号则判断:
a. 此时栈内是否有元素(注意这个要放在第一个判断,之后代码会详解)
b. 栈顶元素是否与其配对
若两个条件都满足则把左括号压出,继续判断下一个;若不满足则结束判断,返回“False”。 - 最后字符数组所有元素判断完后,再次判断栈内是否有元素。
a. 若有元素,则该元素定是未匹配的,返回“False”;
b. 若无元素,则此次括号匹配判断成功。
3. 附上代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
bool check(char *str){
stack<char> st;
char t;
int len = strlen(str);
for(int i=0;i<len;++i){
t=str[i];
switch(t){
case '(':
case '{':
case '[':
st.push(t);
break;
case ')':
//若判断栈顶元素条件放置第一个,则如“]]”该类情况便会因栈空而出错,无法执行if语句的内容。
if(st.empty() || st.top()!='(') return false;
else st.pop();
break;
case '}':
if(st.empty() || st.top()!='{') return false;
else st.pop();
break;
case ']':
if(st.empty() || st.top()!='[') return false;
st.pop();
break;
}
}
return st.empty()?true:false;
}
int main()
{
char str[100];
int len;
while(cin>>str){
if(check(str)) cout<<"True"<<endl;
else cout<<"False"<<endl;
}
return 0;
}