力扣刷题篇之栈与队列篇3

系列文章目录



前言

本系列是个人力扣刷题汇总,本文是栈与队列。刷题顺序按照[力扣刷题攻略] Re:从零开始的力扣刷题生活 - 力扣(LeetCode)

力扣刷题篇之栈与队列篇3_第1张图片


一、表达式求值

150. 逆波兰表达式求值 - 力扣(LeetCode)

力扣刷题篇之栈与队列篇3_第2张图片

力扣刷题篇之栈与队列篇3_第3张图片

力扣刷题篇之栈与队列篇3_第4张图片

方法一,用栈

class Solution {
    public int evalRPN(String[] tokens) {
Deque stack = new LinkedList();
        for (String s : tokens) {
            if ("+".equals(s)) {       
                stack.push(stack.pop() + stack.pop());    
            } else if ("-".equals(s)) {
                stack.push(-stack.pop() + stack.pop());
            } else if ("*".equals(s)) {
                stack.push(stack.pop() * stack.pop());
            } else if ("/".equals(s)) {
                int temp1 = stack.pop();
                int temp2 = stack.pop();
                stack.push(temp2 / temp1);
            } else {
                stack.push(Integer.valueOf(s));
            }
        }
        return stack.pop();
    }
//     int pos = 0;

//     public int evalRPN(String[] tokens) {
//         this.pos = tokens.length - 1;
//         return eval(tokens);
//     }

//     public int eval(String[] tokens) {
//         String token = tokens[pos];
//         if (token.equals("*")) {
//             pos--;
//             return eval(tokens) * eval(tokens);
//         }
//         if (token.equals("+")) {
//             pos--;
//             return eval(tokens) + eval(tokens);
//         }
//         if (token.equals("/")) {
//             pos--;
//             int op = eval(tokens);
//             return eval(tokens) / op;
//         }
//         if (token.equals("-")) {
//             pos--;
//             int op = eval(tokens);
//             return eval(tokens) - op;
//         }
//         pos--;
//         return Integer.parseInt(token);
//     }
 }

力扣刷题篇之栈与队列篇3_第5张图片

方法二,用递归,有点不好理解

class Solution {
//     public int evalRPN(String[] tokens) {
// Deque stack = new LinkedList();
//         for (String s : tokens) {
//             if ("+".equals(s)) {       
//                 stack.push(stack.pop() + stack.pop());    
//             } else if ("-".equals(s)) {
//                 stack.push(-stack.pop() + stack.pop());
//             } else if ("*".equals(s)) {
//                 stack.push(stack.pop() * stack.pop());
//             } else if ("/".equals(s)) {
//                 int temp1 = stack.pop();
//                 int temp2 = stack.pop();
//                 stack.push(temp2 / temp1);
//             } else {
//                 stack.push(Integer.valueOf(s));
//             }
//         }
//         return stack.pop();
    // }
    int pos = 0;

    public int evalRPN(String[] tokens) {
        this.pos = tokens.length - 1;
        return eval(tokens);
    }

    public int eval(String[] tokens) {
        String token = tokens[pos];
        if (token.equals("*")) {
            pos--;
            return eval(tokens) * eval(tokens);
        }
        if (token.equals("+")) {
            pos--;
            return eval(tokens) + eval(tokens);
        }
        if (token.equals("/")) {
            pos--;
            int op = eval(tokens);
            return eval(tokens) / op;
        }
        if (token.equals("-")) {
            pos--;
            int op = eval(tokens);
            return eval(tokens) - op;
        }
        pos--;
        return Integer.parseInt(token);
    }
}

力扣刷题篇之栈与队列篇3_第6张图片

224. 基本计算器 - 力扣(LeetCode)

力扣刷题篇之栈与队列篇3_第7张图片

力扣刷题篇之栈与队列篇3_第8张图片

class Solution {
   
    public int calculate(String s) {

        char[] cs = s.toCharArray();
        this.len = cs.length;
        return backTrack(cs, 0)[0];
    }
    int len;
    // 元素 1 表示 区间 和 元素2 表示区间的右边界
    public int[] backTrack(char[] cs, int p){

        char c = ' ';
        char op = '+';
        int res = 0;
        int num = 0;
        for(int i = p; i < len; ++i){

            c = cs[i];
            if(c > 47 && c < 58) num = num * 10 + c - 48;
            else if(c == '+' || c == '-'){

                res = op == '+' ? res + num : res - num;
                op = c;
                num = 0;
            }else if(c == '('){

                int[] sub = backTrack(cs, i + 1);
                num = sub[0];
                //更新边界
                i = sub[1];
            }else if(c == ')'){

                res = op == '+' ? res + num : res - num;
                return new int[]{res, i};
            }
        }
        res = op == '+' ? res + num : res - num;
        return new int[]{res, len};
    }
}

力扣刷题篇之栈与队列篇3_第9张图片

二、用栈访问最后若干元素


总结

今天先写这点题吧,明天修改

你可能感兴趣的:(算法与数据结构,leetcode,数据结构,leetcode,算法,java)