LeetCode算法刷题|第十天| 232.用栈实现队列 _、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

232.用栈实现队列

class MyQueue {

    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    public MyQueue() {
        stackIn = new Stack<>(); //负责进栈
        stackOut = new Stack<>(); //负责出栈
    }

    public void push(int x) {
        stackIn.push(x); //直接使用栈的添加操作
    }

    public int pop() {
        dumpStackIn();
        return stackOut.pop();
    }

    public int peek() {
        dumpStackIn();
        return stackOut.peek();
    }

    public boolean empty() {
        return stackIn.isEmpty() && stackOut.isEmpty();
    }

    //如果stackOut为空的话,那么将stackIn中的元素全部放到satckOut中
    private void dumpStackIn() {
        if (!stackOut.isEmpty()) return; //如果出的栈不为空
        while (!stackIn.empty()) {
            stackOut.push(stackIn.pop()); //如果入的栈不为空,将该栈内的元素转移到出的栈中
        }
    }
}

225. 用队列实现栈

class MyStack {
    // 用队列实现栈
    Deque<Integer> que1; //new了一个队列

    public MyStack() {
        que1 = new ArrayDeque<>();
    }

    //void push(int x) 将元素 x 压入栈顶。
    public void push(int x) {
        que1.addLast(x);
    }

    //移除并返回栈顶元素。
    public int pop() {
        //移除栈顶元素
        int size = que1.size();
        size--;
        while (size-- > 0) {
            que1.addLast(que1.peekFirst()); //提取队列第一个元素添加到该队列末尾
            que1.pollFirst(); //将队列第一个元素从队列中移除
        }
        //返回栈顶元素
        int res = que1.pollFirst();
        return res;
    }

    //int pop() 移除并返回栈顶元素。
    public int top() {
        return que1.peekLast(); //peekLast()返回队列的最后一个元素
    }

    public boolean empty() {
        return que1.isEmpty();
    }
}

20、有效的括号

思路:
考虑三种情况 :
①左括号多了–>栈为空
②左括号类型不匹配–>与栈顶元素不匹配
③右括号多–>栈为空

Tips:由于栈结构的特殊性,非常适合解决对称匹配类型的问题。

Deque<Character> deque = new LinkedList<>(); //定义一个栈存放匹配的括号
char ch; //从字符串中取值

for (int i = 0; i < s.length(); i++) {
    ch = s.charAt(i);
    //遇见 ( [ { ,将其对应的有括号放入栈
    if (ch == '(') {
        deque.push(')');
    } else if (ch == '[') {
        deque.push(']');
    } else if (ch == '{') {
        deque.push('}');
        //1、字符串中是左括号的情况 ,字符串无效的情况 1、栈中的元素和字符串的元素不匹配 2、左边的括号多
    } else if (deque.isEmpty() || deque.peek() != ch) {
        return false; //字符串无效
        //2、字符串中是右括号的情况:如果在字符串中遇见了一个‘右括号’ ,那么移除栈中的一个元素
    } else {
        deque.pop();
    }
}
//2、字符串中是右括号的情况:右括号多了
return deque.isEmpty();
}

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

解题动画演示:
在这里插入图片描述

思路:使用栈消除与字符串中相等的元素数据。

class Solution {
    public String removeDuplicates(String s) {
        //使用Deque作为堆栈
        ArrayDeque<Character> deque = new ArrayDeque<>();
        char ch;
        for (int i = 0; i < s.length(); i++) {
            ch = s.charAt(i); //获取字符串中的字母
            if (deque.isEmpty() || deque.peek() != ch) {
                deque.push(ch); //相邻元素不相等,添加元素进栈
            } else {
                deque.pop(); //相邻元素相等,移除栈顶元素
            }
        }
        //栈中剩余的元素就是不重复非元素
        String str = "";
        while (!deque.isEmpty()) {
            str = deque.pop() + str;
        }
        return str;
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值