栈 算法专题

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

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

class Solution {
    
    
    public String removeDuplicates(String s) {
    
    
        StringBuffer ret = new StringBuffer();
        char[] ss = s.toCharArray();
        for (int i = 0; i < ss.length; i++) {
    
    
            int len = ret.length();
            if (len > 0 && ss[i] == ret.charAt(len - 1)) {
    
    
                ret.deleteCharAt(len - 1);
            } else {
    
    
                ret.append(ss[i]);
            }
        }
        return ret.toString();
    }
}

二. 比较含退格的字符串

比较含退格的字符串

class Solution {
    
    
    public boolean backspaceCompare(String s, String t) {
    
    
        return changeStr(s).equals(changeStr(t));
    }

    public String changeStr(String s){
    
    
        StringBuffer ret = new StringBuffer();
        char[] ss = s.toCharArray();
        for(char x : ss){
    
    
            int len = ret.length();
            if(x == '#'){
    
    
                if(len > 0){
    
    
                ret.deleteCharAt(len - 1);
                }
            }else{
    
    
                ret.append(x);
            }
        }
        return ret.toString();
    }
}

三. 基本计算器II

基本计算器II

属于表达式求值的问题, 解法都是用栈模拟计算过程

class Solution {
    
    
    public int calculate(String s) {
    
    
        Deque<Integer> ret = new ArrayDeque<>();
        char[] ss = s.toCharArray();
        int n = ss.length;
        int i = 0;
        char op = '+';
        while(i < n){
    
    
            //判断空格
            if(ss[i] == ' '){
    
    
                i++;
            }else if(ss[i] >= '0' && ss[i] <= '9'){
    
    //如果是数字
                int tmp = 0;
                while(i < n && ss[i] >= '0' && ss[i] <= '9'){
    
    //把数字提出来
                    tmp = tmp * 10 + (ss[i]-'0');
                    i++;
                }
                //如果+-就入栈, 如果*/ 就先与栈顶元素计算后入栈
                if(op == '+') ret.push(tmp);
                if(op == '-') ret.push(-tmp);
                if(op == '*') ret.push(ret.poll() * tmp);
                if(op == '/') ret.push(ret.poll() / tmp);
            }else{
    
    //如果是符号
                op = ss[i];
                i++;
            }
        }
        //将栈中的元素全部相加
        int sum = 0;
        while(!ret.isEmpty()){
    
    
            sum += ret.poll();
        }
        return sum;
    }
}

四. 字符串解码

字符串解码

class Solution {
    
    
    public String decodeString(String s) {
    
    
        //一个存放字符串, 一个存放数字
        Stack<StringBuffer> st = new Stack<>();
        Stack<Integer> nums = new Stack<>();
        //细节: 先放入一个空串
        st.push(new StringBuffer());
        int i = 0;
        char[] ss = s.toCharArray();
        int n = ss.length;
        while(i < n){
    
    
            //如果是数字, 就把这个数提出来, 放到数字栈
            if(ss[i] >= '0' && ss[i] <= '9'){
    
    
                int tmp = 0;
                while(i < n && ss[i] >= '0' && ss[i] <= '9'){
    
    
                    tmp = tmp * 10 + (ss[i] - '0');
                    i++;
                }
                nums.push(tmp);
            }else if(ss[i] == '['){
    
    //如果是[, 就把后面的字符串提出来, 放到字符串栈
                i++;
                StringBuffer tmp = new StringBuffer();
                while(i < n && ss[i] >= 'a' && ss[i] <= 'z'){
    
    
                    tmp.append(ss[i]);
                    i++;
                }
                st.push(tmp);
            }else if(ss[i] ==']'){
    
    //如果是], 就进行解析, 取两个栈的栈顶元素, 添加到字符串栈栈顶的后面
                StringBuffer str = st.pop();
                int num = nums.pop();
                while(num-- != 0){
    
    
                    st.peek().append(str);
                }
                i++;
            }else{
    
    //如果是不在[]中的字符串, 就直接添加到字符串栈栈顶的后面
                 StringBuffer tmp = new StringBuffer();
                while(i < n && ss[i] >= 'a' && ss[i] <= 'z'){
    
    
                    tmp.append(ss[i]);
                    i++;
                }
                    st.peek().append(tmp);
            }
        }
        return st.pop().toString();
    }
}

五. 验证栈序列

验证栈序列

class Solution {
    
    
    public boolean validateStackSequences(int[] pushed, int[] popped) {
    
    
        Stack<Integer> st = new Stack<>();
        int j = 0;
        for(int i = 0; i < pushed.length; i++){
    
    
            st.push(pushed[i]);
            while(!st.isEmpty() && popped[j] == st.peek()){
    
    
                st.pop();
                j++;
            }
        }
        if(st.isEmpty()){
    
    
            return true;
        }
        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/m0_73992740/article/details/143335846