给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
这道题的思路很容易想到,如果希望括号能够匹配,那么可以直接使用STL中的栈操作,先入栈,再在字符串中读取下一个括号,如果不匹配那么就入栈,否则出栈,如果最后栈为空那么就return true
下面先回顾一下栈的基本操作:
push(): 向栈内压入一个成员;
pop(): 从栈顶弹出一个成员;
empty(): 如果栈为空返回true,否则返回false;
top(): 返回栈顶,但不删除成员;
size(): 返回栈内元素的大小;
下面给出可运行的AC代码:
#include<iostream>
#include<cstring>
#include<string>
#include<stack>
using namespace std;
bool isValid(string s) {
stack<char>a;
int len=s.size();
for(int i=0;i<len;i++){
if(a.empty()==true)a.push(s[i]);
else{
if(a.top()=='('&&s[i]==')'||a.top()=='['&&s[i]==']'||a.top()=='{'&&s[i]=='}')
a.pop();
else
a.push(s[i]);
}
}
return a.empty();
}
int main(){
string s;
cin>>s;
if(isValid(s)==1)
cout<<"true";
else
cout<<"false";
return 0;
}