堆栈面试题之有效的括号
题目描述
给定一个只包 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意:空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
解题思路
对于没有学过「栈」这个数据结构的同学来说可能遇到这一类的问题咋一看可能有点没有头绪,但是其实只需要判断下一个元素是否在栈顶即可判断括号的匹配情况,即如果遇到一个左括号,我们将这个符号插入压栈,如果遇到一个右括号,我们判断一下栈顶的元素是否是对应的左括号,如果是(即与栈顶元素匹配),那么就一起出栈,否则的话直接返回 false
表示字符串无效。
我们来看一例子,假设字符串是 ( ) [ ]
,栈的变化分别为:
(
入栈)
入栈,发现与栈顶元素(
匹配,出栈,目前栈为空[
入栈]
入栈,发现和栈顶元素[
匹配,出栈,栈为空
而如果是:(]
,栈的变化会是怎么样的呢?
(
入栈]
入栈,栈顶元素为(
,不匹配,直接返回false
C++ 代码实现如下:
class Solution {
public:bool isValid (string const& s) {// 定义左右两边的括号序列string left = "([{";string right = ")]}";stack<char> stk;
for (auto c : s) {// 判断每一个输入的字符是否为左括号,如果是就压栈if (left.find(c) != string::npos) {stk.push (c);} else {// 如果不是左括号,且如果发现栈为空,或者栈顶元素不是匹配的左括号的话,就返回 falseif (stk.empty () || stk.top () != left[right.find (c)])return false;// 如果匹配的话,就把栈顶出栈elsestk.pop ();}}return stk.empty();}
};
有了栈的知识之后,另一个可以用栈来完成的操作是实现一个队列。