栈和队列


1047. 删除字符串中的所有相邻重复项

version01

class Solution {
    public String removeDuplicates(String s) {
        Deque stack = new LinkedList<>();
        char[] a = s.toCharArray();
        for (char c : a) {
            if (stack.isEmpty()) {
                stack.push(c);
            } else if (stack.peek().equals(c)) {
                stack.pop();
            } else {
                stack.push(c);
            }
        }
        String res = "";
        while (!stack.isEmpty()) {
            res = stack.pop() + res;
        }
        return res;
    }
}

效率很低

class Solution {
    public String removeDuplicates(String s) {
        //字符串做栈
        StringBuffer sb = new StringBuffer();
        int len;
        for (char c : s.toCharArray()) {
            len = sb.length(); //当前字符串容量
            if (len == 0 || c != sb.charAt(len - 1)) {
                sb.append(c);
            } else {
                sb.deleteCharAt(len - 1);
            }
        }
        return sb.toString();
    }
}

 ok,还可以,下面是双指针的效率,设置快慢指针,快指针的内容给慢指针,如指向内容相等则慢指针回退一步,即跳过。

150. 逆波兰表达式求值

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

这里用String[]存表达式而不用Char[]是因为不是一位数的运算,为什么说这个是因为哥们用switch case语句取String i的charAt(0)作为case的判断式导致出现问题。

参考:programmercarl.com