【LeetCode】Valid Parentheses合法括号

给定一个仅包含 ‘(‘、‘)‘、‘{‘、‘}‘、‘[‘、‘]‘的字符串,确定输入的字符串是否合法。

e.g. "()"、"()[]{}"、"[()]([]({}))" 是合法的,而"(]"、"([)]" 是不合法的。

使用栈stack

C++实现:

 1 bool isValid(string s) {
 2     stack<char> stack;
 3     for (char &c : s) {
 4         if (c == ‘(‘)
 5             stack.push(‘)‘);
 6         else if (c == ‘{‘)
 7             stack.push(‘}‘);
 8         else if (c == ‘[‘)
 9             stack.push(‘]‘);
10         else if (stack.empty() || (stack.top() != c))
11             return false;
12         else
13             stack.pop();
14     }
15     return stack.empty();
16 }

对应的Java实现:

 1 public boolean isValid(String s) {
 2     Stack<Character> stack = new Stack<Character>();
 3     for (char c : s.toCharArray()) {
 4         if (c == ‘(‘)
 5             stack.push(‘)‘);
 6         else if (c == ‘{‘)
 7             stack.push(‘}‘);
 8         else if (c == ‘[‘)
 9             stack.push(‘]‘);
10         else if (stack.isEmpty() || stack.pop() != c)  
11             return false;
12     }
13     return stack.isEmpty();
14 }

C++中的stack,其中有两个方法:

  • pop(),返回void,不返回类型<T>。
  • top(),返回栈顶的引用。

pop()不返回栈顶元素的原因是:

  • 异常安全原因

如果要实现,代码如下,

template<class T>
T stack<T>::pop() {
    if( vused_ == 0) {
        throw "pop from empty stack";
    } else {
        return v_[--vused_ - 1];
    }
}

试图返回 v_[--vused_ - 1] 的时候,会调用 T 的拷贝构造函数,如果调用的时候发生异常,并没有返回正确的值,但是栈顶元素已经弹出了,这时就丢失了栈顶数据。

如果这样写,

template<class T>
T stack<T>::pop() {
    if( vused_ == 0) {
        throw "pop from empty stack";
    } else {
        T result = v_[vused_ - 1];
        --vused_;
        return result;
    }
}

先建立一个栈顶元素的副本,如果拷贝构造函数出现异常,那么 --vused_ 不会执行,就不会丢失数据。但假如 --vused_ 和 return result 之间发生异常,依然会出问题。也就是说,如果想同时做 pop() 和 top() ,一定要保证 --vused_ 和 return result 是一个执行事务。

  • 效率原因

因为栈顶元素在栈中已经不存在,必须在按引用返回之前现将其存储到某个地方。如果选用动态内存,除非动态内存最终被删除,否则将导致内存泄露。

如果调用拷贝构造函数,对象按值传递的方式从函数返回,效率低下。

时间: 2024-12-21 06:19:58

【LeetCode】Valid Parentheses合法括号的相关文章

[Leetcode] valid parentheses 有效括号对

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. 题意:给

[LeetCode] Valid Parentheses 验证括号

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 "([)]"

LeetCode Valid Parentheses 有效括号

1 class Solution { 2 public: 3 void push(char c){ //插入结点 4 struct node *n=new struct node; 5 n->nex=0; 6 n->ch=c; 7 n->pre=last; 8 last->nex=n; 9 last=last->nex; 10 } 11 bool jud(char c){ //判断 12 struct node *m; 13 if(c==']') 14 c='['; 15 e

Leetcode: Valid Parentheses 有效的括号匹配

Valid Parentheses: 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 "(]"

LeetCode——Valid Parentheses

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 "([)]"

[LeetCode] Generate Parentheses 生成括号

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 在LeetCo

LeetCode: Valid Parentheses [020]

[题目] 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 "([)]

LeetCode: Valid Parentheses 解题报告

Valid Parentheses 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 "(]" a

LeetCode Generate Parentheses 构造括号串(DFS简单题)

题意: 产生n对合法括号的所有组合,用vector<string>返回. 思路: 递归和迭代都可以产生.复杂度都可以为O(2n*合法的括号组合数),即每次产生出的括号序列都保证是合法的. 方法都是差不多的,就是记录当前产生的串中含有左括号的个数cnt,如果出现右括号,就将cnt--.当长度为2*n的串的cnt为0时,就是答案了,如果当前cnt比剩下未填的位数要小,则可以继续装“(”,否则不能再装.如果当前cnt>0,那么就能继续装“)”与其前面的左括号匹配(无需要管匹配到谁,总之能匹配)