zoukankan      html  css  js  c++  java
  • leetcode:栈

    1. evaluate-reverse-polish-notation

    Evaluate the value of an arithmetic expression in Reverse Polish Notation.

    Valid operators are+,-,*,/. Each operand may be an integer or another expression.

    Some examples:

      ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
      ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

    用一个栈存储操作数,遇到操作数直接压入栈内,遇到操作符就把栈顶的两个操作数拿出来运算一下,然后把运算结果放入栈内。
    public class Solution {  
        public int evalRPN(String[] tokens) {  
            int ret = 0;  
            Stack<Integer> num = new Stack<Integer>();  
            for (int i = 0; i < tokens.length; i++) {  
                if (isOperator(tokens[i])) {  
                    int b = num.pop();  
                    int a = num.pop();  
                    num.push(calc(a, b, tokens[i]));  
                } else {  
                    num.push(Integer.valueOf(tokens[i]));  
                }  
            }  
            ret = num.pop();  
            return ret;  
        }  
          
        boolean isOperator(String str) {  
            if (str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/"))   
                return true;  
            return false;  
        }  
          
        int calc(int a, int b, String operator) {  
            char op = operator.charAt(0);  
            switch (op) {  
            case '+': return a + b;  
            case '-': return a - b;  
            case '*': return a * b;  
            case '/': return a / b;  
            }  
            return 0;  
        }  
    }  
    View Code

    2. Longest Valid Parentheses

    Given a string containing just the characters ‘(‘ and ‘)‘, find the length of the longest valid (well-formed) parentheses substring.

    For "(()", the longest valid parentheses substring is "()", which has length = 2.

    Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.

    给定一个字符串值包含字符‘(‘ and ‘)‘,找出最长有效括号子串。

    对于 "(()",最长有效子串为"()",长度为2.

    另一个例子是")()())",其中的最长有效括号子串为"()()",长度为4.

    1. stack里面装的一直是“还没配好对的括号的index
    2. 是’(‘的时候push
    3. 是’)‘的时候,说明可能配对了;看stack top是不是左括号,不是的话,push当前右括号
    4. 是的话,pop那个配对的左括号,然后update res:i和top的(最后一个配不成对的)index相减,就是i属于的这一段的当前最长。如果一pop就整个栈空了,说明前面全配好对了,那res就是最大=i+1
    public class Solution 
    {
        public int longestValidParentheses(String s) 
        {
            int res = 0;
            Stack<Integer> stack = new Stack<Integer>();
            char[] arr = s.toCharArray();
            for (int i = 0; i < arr.length; i++) 
            {
                
                
                //Pop()取出栈顶元素,栈顶元素被弹出Stack;
                //Peek()读得栈顶元素,但栈顶元素没有被弹出Stack。
                if (arr[i] == ')' && !stack.isEmpty() && arr[stack.peek()] == '(') 
                {
                    stack.pop();
                    if (stack.isEmpty())
                        res = i + 1;
                    else
                        res = Math.max(res, i - stack.peek());
                } 
                else 
                {
                    stack.push(i);
                }
            }
            return res;
        }
    }
    View Code

    3. vali 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.

    一个个检查给的characters,如果是左括号都入栈;如果是右括号,检查栈如果为空,证明不能匹配,如果栈不空,弹出top,与当前扫描的括号检查是否匹配。

    全部字符都检查完了以后,判断栈是否为空,空则正确都匹配,不空则证明有没匹配的。

    注意:

    检查字符是用==,检查String是用.isEqual(),因为String是引用类型,值相等但是地址可能不等。

    public boolean isValid(String s) {
            if(s.length()==0||s.length()==1)
                return false;
    
            Stack<Character> x = new Stack<Character>();
            for(int i=0;i<s.length();i++){
                if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['){
                    x.push(s.charAt(i));
                }else{
                    if(x.size()==0)
                        return false;
                    char top = x.pop();
                    if(s.charAt(i)==')')
                        if(top!='(')
                            return false;
                    else if(s.charAt(i)=='}')
                        if(top!='{')
                            return false;
                    else if(s.charAt(i)==']')
                        if(top!='[')
                            return false;
                }
        }
            return x.size()==0;
    }
    View Code







































































































  • 相关阅读:
    windows2000/xp运行命令全集
    IP数据包的校验和算法C#版(原)
    做系统清理的批处理
    Combox用ValueMember 之后再添加一项
    安装部署基础——Windows Application
    文件编码
    Left/right join 和inner join 区别
    应用Url重写时CSS引用问题
    数据绑定控件单选框
    算法题:水杯倒水的问题
  • 原文地址:https://www.cnblogs.com/zxqstrong/p/5367247.html
Copyright © 2011-2022 走看看