【算法】栈

简介: 栈相关算法题,供参考,附有链接地址及板书


image.gif 编辑

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

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

二:比较含退格的字符串

三:基本计算器

四:字符串解码

五:验证栈序列

牛客网

一:有效括号序列


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


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

image.gif 编辑模拟重力消消乐

image.gif 编辑

class Solution {
    public String removeDuplicates(String ss) {
        //用数组模拟栈
        StringBuffer buffer = new StringBuffer();
        //先把字符串转化为字符数组,在进行遍历
        char[] s = ss.toCharArray();
        //在进行条件判断
        
        for(char ch : s){
            //如果栈不为空,并且ch == 栈顶元素,那就出栈
            if(buffer.length() > 0  && ch == buffer.charAt(buffer.length()-1)){
                buffer.deleteCharAt(buffer.length()-1);
            }else{ // 栈为空 或者 ch != 栈顶元素那就进栈
                buffer.append(ch);
            }
        }
        return buffer.toString();
        
    }
}

image.gif

二:比较含退格的字符串

844. 比较含退格的字符串 - 力扣(LeetCode)

image.gif 编辑

太赖皮了,还能优化,可以写成函数的形式,代码优化复用

传统栈的解法

用完StringBuffer后记得转换成String类型才能使用equals()方法

class Solution {
    public boolean backspaceCompare(String ss, String tt) {
        Stack<Character> s1 = new Stack<>();
        Stack<Character> t1 = new Stack<>();
        char[] s = ss.toCharArray();
        for(char ch : s){
            if(!s1.isEmpty() && ch == '#'){
                s1.pop();
            }else if(ch != '#'){
                s1.push(ch);
            }
        }
        char[] t = tt.toCharArray();
        for(char ch : t){
            if(!t1.isEmpty() && ch == '#'){
                t1.pop();
            }else if(ch != '#'){
                t1.push(ch);
            }
        }
        if(s1.isEmpty() && t1.isEmpty()){
            return true;
        }
        
        StringBuffer str1  = new StringBuffer();
        while(!s1.isEmpty()){
            str1.append(s1.pop());
        }
        StringBuffer str2  = new StringBuffer();
        while(!t1.isEmpty()){
            str2.append(t1.pop());
        }
        String x = str1.toString();
        String y = str2.toString();
        return x.equals(y);
    }
}

image.gif

解法二:数组模拟栈

class Solution {
    public boolean backspaceCompare(String ss, String tt) {
        return changeStr(ss).equals(changeStr(tt));
    }
    // 这个方法是用来模拟栈的出和进
    public String changeStr(String str){
        StringBuffer ret = new StringBuffer();
        for(int i = 0 ; i < str.length() ; i++){
            char ch = str.charAt(i);
            if(ch != '#'){
                ret.append(ch);
            }else if(!ret.isEmpty() && ch == '#'){//ret非空才能删除元素
                int len = ret.length();
                ret.deleteCharAt(len-1);
            }
        }
        return ret.toString();
    }
}

image.gif

三:基本计算器

227. 基本计算器 II

image.gif 编辑

image.gif 编辑

image.gif 编辑

class Solution {
    public int calculate(String ss) {
        // 1:new 一个栈
        Stack<Integer> stack = new Stack<>();
        // 2:遍历字符串
        char[] s = ss.toCharArray();
        int i = 0 , n = s.length;
        char op = '+';
        while(i < n){
            // 3:分情况讨论,重点是确定tem和字符的情况
            if(s[i] == ' ') i++;
             // 4:利用字符的ASCII码值进行字符和整型之间的转换
            else if(s[i] >= '0' && s[i] <= '9'){
                int tem = 0;
                while( (i < n) && (s[i] >= '0' && s[i] <= '9') ){
                    tem = 10 * tem + (s[i] - '0');
                    i++;//这里的if判断条件太巧妙了利用ASCII值,并且i++后的处理真是绝了
                }
                if(op == '+') stack.push(tem);
                else if(op == '-') stack.push(-tem);
                else if(op == '*') stack.push(stack.pop() * tem);
                else if(op == '/') stack.push(stack.pop() / tem);
            }else{
                op = s[i];
                i++;
            }
        }
        int ret = 0;
        while(!stack.isEmpty()){
            ret += stack.pop();
        }
       return ret;
        
    }
        
}

image.gif

四:字符串解码

394. 字符串解码

image.gif 编辑

image.gif 编辑

image.gif 编辑

image.gif 编辑

class Solution {
    public String decodeString(String ss) {
        // 准备工作
        Stack<StringBuffer> str = new Stack<>();
        Stack<Integer> nums = new Stack<>();
        char[] s = ss.toCharArray();
        int n = s.length, i = 0;
        str.push(new StringBuffer());//放一个空串
        // 遍历字符数组并分情况讨论
        while (i < n) {
            // 处理数字的情况
            if (s[i] >= '0' && s[i] <= '9') {
                int tem = 0;
                while (i < n && s[i] >= '0' && s[i] <= '9') {
                    tem = 10 * tem + (s[i] - '0');
                    i++;
                }
                // 处理完放入栈中
                nums.push(tem);
            }else if(s[i] == '['){//处理[]中的字符串,需要拼接一下字符
                i++;
                StringBuffer buffer = new StringBuffer();
                while(i < n && s[i] >= 'a' && s[i] <= 'z'){  //while(s[i] != ']')不能过
                    buffer.append(s[i]);
                    i++;
                }
                str.push(buffer);
            }else if(s[i] == ']'){
                StringBuffer s1 = str.pop();
                int num1 = nums.pop();
                StringBuffer tem = new StringBuffer();
                while(num1 != 0){
                    tem.append(s1);
                    num1--;
                }
                // 这里追加字符要考虑到栈顶为空的情况
                str.peek().append(tem);
                i++;
            }else{//这种情况是字符单独存在,需要直接追加到栈顶元素
                StringBuffer buffer = new StringBuffer();
                while(i < n && s[i] >= 'a' && s[i] <= 'z'){
                    buffer.append(s[i]);
                    i++;
                }
                str.peek().append(buffer);
            }
        }
        return str.pop().toString();
    }
}

image.gif

五:验证栈序列

946. 验证栈序列

image.gif 编辑

image.gif 编辑

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        //定义两个指针
        int i = 0 , j = 0 , n = pushed.length;
        Stack<Integer> stack = new Stack<>();
        while(i < n){
            if(i < n && pushed[i] != popped[j]){
                stack.push(pushed[i]);
                i++;
            }else{
                //不相等的时候,先进栈
                stack.push(pushed[i]);
                // 出栈
                while(i < n && !stack.isEmpty() && stack.peek() == popped[j]){
                    stack.pop();
                    j++;
                }
                i++;
            }
        }
        return stack.isEmpty();
    }
}

image.gif

牛客网

一:有效括号序列

有效括号序列_牛客题霸_牛客网

压弹策略

image.gif 编辑

import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return bool布尔型
     */
    public boolean isValid (String ss) {
        // write code here
        Stack<Character> stack = new Stack<>();
        char[] s = ss.toCharArray();
        
        for(char ch : s){
            if(ch == '('){
                stack.push(')');
            }else if(ch == '{'){
                stack.push('}');
            }else if(ch == '['){
                stack.push(']');
            }else if(stack.isEmpty() || ch != stack.pop()){
                return false;
            }else{
                // 这里的条件已经是出栈了,所以不用再写pop方法了
            }
        }
        return stack.isEmpty();
    }
}

image.gif


相关文章
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
89 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
48 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
6月前
|
存储 算法 调度
数据结构与算法-栈篇
数据结构与算法-栈篇
32 3
|
2月前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
68 3
|
6月前
|
算法 C语言
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
|
2月前
|
算法 C++
【算法单调栈】 矩形牛棚(C/C++)
【算法单调栈】 矩形牛棚(C/C++)
|
4月前
|
算法
【算法】栈算法——逆波兰表达式求值
【算法】栈算法——逆波兰表达式求值
|
4月前
|
存储 算法
【算法】栈算法——最小栈
【算法】栈算法——最小栈
|
4月前
|
算法
【算法】栈算法——栈的压入、弹出序列
【算法】栈算法——栈的压入、弹出序列