Day11|栈与队列

题目

有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

  • 思路:使用栈来进行操作,必须先将栈顶元素与当前剩下的字符中的第一个进行比较,匹配上了将之栈顶删除,否则将当前的元素添加到栈中,最后判断栈是否为空即可返回
class Solution {
    public boolean isValid(String s) {
        Deque<Character> deque=new ArrayDeque<>();
        for(int i=0;i<s.length();i++){
            char m=s.charAt(i);
            if(deque.isEmpty()){
                deque.addLast(m);
            }else{
                if(isMatch(deque.peekLast(),m)){
                    deque.pollLast();
                }else{
                    deque.addLast(m);
                }
            }
        }
        return deque.isEmpty();
    }
    public boolean isMatch(char a,char b){
        if(a=='('&&b==')'){
            return true;
        }else if(a=='['&&b==']'){
            return true;
        }else if(a=='{'&&b=='}'){
            return true;
        }else{
            return false;
        }
    }
}

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

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

  • 该题主要思路如下:首先这是一道经典的可以使用匹配来处理的题目,可以使用栈将字符串中的元素push进去,而一旦当前的字符与栈顶的字符一致,将栈顶删除,注意,使用peekLast获得的元素,在当前栈为空时,返回null值
  • 也可以直接使用字符串作为栈,省去将栈转换成字符串的时间。java中可以使用StringBuilder构建字符串,使用Deque实现栈
public String removeDuplicates(String s) {
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++){
            char m=s.charAt(i);
            if(sb.length()==0){
                sb.append(m);
            }else {
                if(m==sb.charAt(sb.length()-1))
                    sb.deleteCharAt(sb.length()-1);
                else{
                    sb.append(m);
                }
            }
        }
        return sb.toString();
    }

150. 逆波兰表达式求值
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。
每个操作数(运算对象)都可以是一个整数或者另一个表达式。
两个整数之间的除法总是 向零截断 。
表达式中不含除零运算。
输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。

  • 思路:该题能够第一时间想到使用栈进行操作,但是需要考虑到token的字符串中的类型,会不会是一个计算的表达式,但是通过示例看,应当没有计算表达式,因此代码如下:

  • `class Solution {
    public int evalRPN(String[] tokens) {
    Deque myDeque=new ArrayDeque<>();
    for(int i=0;i<tokens.length;i++){
    String m=tokens[i];
    boolean flag=isMatch(m);
    if(flag==true){
    int x=myDeque.pollLast();
    int y=myDeque.pollLast();
    int temp=compute(y,x,m);
    myDeque.addLast(temp);
    }else{
    int n=Integer.parseInt(m);
    myDeque.addLast(n);
    }
    }
    return myDeque.peekLast();

    }
    public boolean isMatch(String a){
    if(“+”.equals(a)||“-”.equals(a)||“/”.equals(a)||"“.equals(a)){
    return true;
    }
    return false;
    }
    public int compute(int a,int b,String s){
    if(”+“.equals(s))
    return a+b;
    else if(”-“.equals(s)){
    return a-b;
    }else if(”/".equals(s)){
    return a/b;
    }else{
    return a
    b;
    }
    }

}`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值