46.Valid Parentheses

  1. Valid Parentheses My Submissions QuestionEditorial Solution
    Total Accepted: 106346 Total Submissions: 361674 Difficulty: Easy
    Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.

The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not.

思路:
经典的括号匹配问题
沿用严奶奶的书的描述来说,
[ ( [ ] [ ] ) ]
1 2 3 4 5 6 7 8

计算机接受了第一个字符,本来期待 第8个的出现,结果2号出现了,那么现在便期待第7号的出现,。。。。,依次类推,当2号的需求满足了,便满足1的需求,也就是说期待值是随着左括号的增加一直在变的,类似于栈先进入的元素出栈优先级更低,开始的优先级慢慢降低,这就是栈的思想。

辣么,程序就可以写出来了。。

注意栈是一种经典的数据结构,在面试中常会遇到这样的问题,需要解释清楚:

从本质来说,栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

class Solution {
public:
    bool isValid(string s) {
        stack<char> s_stack;
        map<char,char> mp;
        mp['(']=')';mp['{']='}';mp['[']=']';
        for(int i=0;i<s.size();++i)
        {
            if(s[i]=='('||s[i]=='{'||s[i]=='[')
                s_stack.push(s[i]);
            else  {
                    if(s_stack.empty())return false;//如果栈为空,遇到右括号
                    else if(!s_stack.empty()&&s[i]==mp[s_stack.top()])s_stack.pop();//如果不空,栈顶元素是右括号匹配的,弹出栈顶元素
                    else return false;//不空又不匹配,说明该右括号首次出现并无匹配或者出现错了时机,如([),((]

            }
        }
        if(s_stack.empty())return true;
        else return false;
    }
};
原文地址:https://www.cnblogs.com/freeopen/p/5482920.html