力扣原题
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串
实现代码
class Solution
{
public:
bool isValid(string s)
{
stack<int> st;
for(int i=0;i<s.size();i++)
{
//1.根据左括号把右括号进栈
if(s[i]=='{') st.push('}');
else if(s[i]=='(') st.push(')');
else if(s[i]=='[') st.push(']');
//2.判断栈里面存放的右括号是否为空,为空表明s里面的括号右括号多了,判断当前括号是否和栈顶元素一样
else if(st.empty() || s[i]!=st.top()) return false;
//3.如果以上条件都不满足,说明匹配到右括号,就把该括号出栈
else st.pop();
}
//此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
return st.empty();
}
};
测试代码
/*************************************************************************
> File Name: 3-有效括号.cpp
> Author:
> Mail:
> Created Time: Mon 11 Apr 2022 03:13:28 PM CST
用栈实现括号匹配问题:
https://leetcode-cn.com/problems/valid-parentheses/
************************************************************************/
#include<iostream>
#include<stack>
using namespace std;
class Solution
{
public:
bool isValid(string s)
{
stack<int> st;
for(int i=0;i<s.size();i++)
{
//1.根据左括号把右括号进栈
if(s[i]=='{') st.push('}');
else if(s[i]=='(') st.push(')');
else if(s[i]=='[') st.push(']');
//2.判断栈里面存放的右括号是否为空,为空表明s里面的括号右括号多了,判断当前括号是否和栈顶元素一样
else if(st.empty() || s[i]!=st.top()) return false;
//3.如果以上条件都不满足,说明匹配到右括号,就把该括号出栈
else st.pop();
}
//此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
return st.empty();
}
};
int main()
{
Solution *s=new Solution;
string c="{}[]()";
cout <<s->isValid(c)<<endl;
return 0;
}