栈与队列算法题

目录

 20. 有效的括号 

看到题目的第一想法

看到代码随想录之后的想法

自己实现过程中遇到的困难

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

看到题目的第一想法

看到代码随想录之后的想法

自己实现过程中遇到的困难

 150. 逆波兰表达式求值 

看到题目的第一想法

看到代码随想录之后的想法

自己实现过程中遇到的困难


 20. 有效的括号 

讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。 

大家先自己思考一下 有哪些不匹配的场景,在看视频 我讲的都有哪些场景,落实到代码其实就容易很多了。

题目链接/文章讲解/视频讲解:代码随想录

看到题目的第一想法

     用两个栈,一个存左括号一个存右括号,然后同时弹栈进行匹配

     会有困难,无法考虑左右括号匹配,但是左右括号嵌套的情况

      比如:([)]  其实不符合规定,但是也能成功

看到代码随想录之后的想法

         只需要用一个栈,当遇到左括号时入栈对应的右括号,右括号时出栈,看是否相等

        还有两种情况,一种是还没遍历完且为右括号,栈空了,一种是栈里还有值都是不匹配

自己实现过程中遇到的困难

            1 匹配时记得需要判空,否则会报错,若为空直接返回false即可

                 if(c[i]=='}'){
                        if(stack.isEmpty()||stack.pop()!='{'){
                            return false;
                        }
                    }

           //这个return的写法比我方便
            return stack.isEmpty();

/*class Solution {
    //字符串入栈,左括号入栈,又括号出栈
    //用两个栈会有问题,([)]  其实不符合规定,但是也能成功
    //若只用一个栈,遍历时({[入栈   ]})时出栈,一次即可
    public boolean isValid(String s) {
/**        Stack stack1 = new Stack<>();
        Stack stack2 = new Stack<>();
        char[] c = s.toCharArray();
        for(int i =0 ;i stack = new Stack<>();
        char[] c = s.toCharArray();
        for(int i =0 ;i stack = new Stack<>();
        char[] c = s.toCharArray();
        for(int i =0 ;i

             

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

栈的经典应用。 

要知道栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。

题目链接/文章讲解/视频讲解:代码随想录

看到题目的第一想法

     用一个栈,遍历字符串,字符串挨个入栈,当遇到与栈顶相同字符的时候,就出栈栈顶元素再继续往下遍历

      最后输出栈内元素,进行反转就是消除相邻字符的串了

看到代码随想录之后的想法

         和我想法一样

        代码随想录用的ArrayDeque

        代码随想录还用到了双指针,不断用fast覆盖slow指针,如果遇到相同的就--,再进行覆盖(可以研究一下)

自己实现过程中遇到的困难

        StringBuilder操作不熟悉,以为不能append(char)其实都可以append,直接进行append,再 return sb.reverse().toString()即可

class Solution {
    public String removeDuplicates(String s) {
        //删除相邻的重复项
        //acbbca,如果是重复项的话应该是这种形式,有点像栈,
        //字符串入栈,遇到相等栈顶的再弹出,直到不相等,再入栈,删除相等的重复项
        char[] c = s.toCharArray();
        Stack stack = new Stack();
        for(int i=0;i

 

 150. 逆波兰表达式求值 

本题不难,但第一次做的话,会很难想到,所以先看视频,了解思路再去做题 

题目链接/文章讲解/视频讲解:代码随想录

看到题目的第一想法

    遍历,数值入栈,遇到符号再弹出计算后再入栈

       String和数值表达式该怎么匹配,其实就按照字符串内容的+-*/自行定义计算规则即可,而不要纠结字符串内容

看到代码随想录之后的想法

         和我想法一样

        所有条件都不满足时执行常规操作push

        再分析需要哪些if 条件

        返回栈顶即可

        使用Integer.valueOf(int值)

自己实现过程中遇到的困难

        注意减法和除法的操作顺序

        

class Solution {
    public int evalRPN(String[] tokens) {
        //逆波兰表达式
        //遇到值则入栈,遇到符号则弹出栈顶两个元素再入栈
        //String转为表达式进行计算要用什么?直接计算即可
        //用Integer.valueOf来对每个值转为int存入栈中
        //我的方法是用String栈比较麻烦
        /*Deque queue = new ArrayDeque();
        for(int i=0;i queue = new LinkedList<>();
        for(String s : tokens){
            //如果为符号的话
            if("+".equals(s)){
                //进行加法再存入栈中
                queue.push(queue.pop()+queue.pop());
            }else if("-".equals(s)){
                //进行减法再存入栈中
                int temp1 = queue.pop();
                int temp2 = queue.pop();
                queue.push(temp2-temp1);
            }else if("*".equals(s)){
                //进行乘法再存入栈中
                queue.push(queue.pop()*queue.pop());
            }else if("/".equals(s)){
                int temp1 = queue.pop();
                int temp2 = queue.pop();
                queue.push(temp2/temp1);
            }else{
                //如果不为符号的话
                queue.push(Integer.valueOf(s));
        
            }
        }
        return queue.peek();

    }
}

你可能感兴趣的:(算法)