DAY11-栈与队列2,20,1047,150

这几道题都是栈的应用场景

20:

最开始的思路是将String转换为字符数组,用一个新的字符数组存储单索引的值,再循环判断原字符数组双索引值处是否与单索引处值一致。

输入: "{[]}"

输出: true

这种在上面这种场景下就是有问题的。

括号匹配是使用栈解决的经典问题。

有哪些不匹配的场景:左边多-栈里留有剩余,右边多-栈为空但还没遍历完,类型匹配不上-栈里元素不匹配。

步骤,遇到左括号把右括号放进栈里,遇到右括号开始匹配。

剪枝:字符串长度为奇数,直接返回。

public boolean isValid(String s) {
        int len=s.length();
        if(len%2!=0){
            return false;
        }
        Stack<Character> st = new Stack<>();
        char ch;
        for(int i=0;i<len;i++){
            ch=s.charAt(i);
            if(ch=='('){
                st.push(')');
            }else if(ch=='{'){
                st.push('}');
            }else if(ch=='['){
                st.push(']');
            }else if(st.isEmpty()||st.peek()!=ch){
                return false;
            }else{
                st.pop();
            }
        }  
        return st.isEmpty();
    }

1047:栈为什么适合做类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。知道了用栈做算是A了一道简单题。

public String removeDuplicates(String s) {
        int len=s.length();
        char ch;
        Stack<Character> st = new Stack<>();
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<len;i++){
            ch=s.charAt(i);
            if(!st.isEmpty()&&st.peek()==ch){
                st.pop();
            }else{
            st.push(ch);   
            }         
        }
        while(!st.isEmpty()){
            sb.append(st.pop());
        }
        return new String(sb.reverse());
}

150:

逆波兰表达式主要有以下两个优点:

去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。

适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。

类似于二叉树的后序遍历,对计算机友好。

public int evalRPN(String[] tokens) {
        Stack<Integer> st = new Stack<>();
        for(String s:tokens){
            if("+".equals(s)||"-".equals(s)||"*".equals(s)||"/".equals(s)){
               int num1=(int)st.pop();
               int num2=(int)st.pop();
               if("+".equals(s)){
                st.push(num1+num2);
               }else if("-".equals(s)){
                st.push(num2-num1);
               }else if("*".equals(s)){
                st.push(num1*num2);
               }else{
                st.push(num2/num1);
               }
            }else{
                st.push(Integer.valueOf(s));
            }
        }
        return st.pop();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值