20230428 -栈与队列1 | 232. 用栈实现队列、225. 用队列实现栈、Queue和Deque异同介绍

1、232. 用栈实现队列

在这里插入图片描述

class MyQueue {
    //整体实现思路:队列是先进先出,栈是先进后出。使用两个栈,一个栈A负责进,一个栈B负责接收栈A数据,然后出出,队列:A->B>C 栈A:A->B>C 栈B:栈A进,C->B->A,然后出,实现A->B->C
    Stack<Integer> stackIn;
    Stack<Integer>  stackOut;
    public MyQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }
    //进,只在stackIn中
    public void push(int x) {
        stackIn.push(x);
    }
    //出,出就要用到stackIn和stackOut结合
    public int pop() {
       dumpStackIn();
       return stackOut.pop(); //出,如果有元素,那就出
    }
    //获取头元素
    public int peek() {
        dumpStackIn();
        return stackOut.peek();
    }
    //判断是否为空,两个都为空才行
    public boolean empty() {
        return stackIn.isEmpty() && stackOut.isEmpty();
    }
    public void dumpStackIn(){
        if(!stackOut.isEmpty()) return; //不为空什么都不管  
        while(!stackIn.isEmpty()){ // 没有元素,则就需要将stacIn中装到stackOut
            stackOut.push(stackIn.pop());
        }
    }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */

下面一种错误的写法,why? 错在pop和top都进行了一次移除并追加操作

public int pop() {
//弹出是,就是出栈,将要出元素的前面元素移除并添加在该队列后面即可。
int len = queue.size();
while(len>1){
queue.offer(queue.poll());
len–;
}
return queue.poll();
}
public int top() {
int len = queue.size();
while(len>1){
queue.offer(queue.poll());
len–;
}
return queue.peek();
}

class MyStack {

    //用队列实现栈,跟用栈实现队列不一样,单方向队列下,假设用一样的思维的话,第二个队列还是先进先出,并不能实现栈的思维。
    //实现过程1:可以使用两个队列,主队列出,辅助队列只是为了临时存储,出了之后又要恢复。
    //实现过程2:使用一个队列,进的时候只需要将新的元素追加到前面即可。
    Queue<Integer> queue ;
    public MyStack() {
        queue = new LinkedList<>();
    }
    
    public void push(int x) {
        queue.offer(x);
        int len = queue.size();
        while(len>1){
            queue.offer(queue.poll());
            len--;
        }
    }
    
    public int pop() {
        return queue.poll();
    }
    
    public int top() {
       return queue.peek();
    }
    
    public boolean empty() {
        return queue.isEmpty();
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */

3、补充知识

  • Queue和Deque异同介绍

  • 我们知道,Queue是队列,只能一头进,另一头出。

  • 如果把条件放松一下,允许两头都进,两头都出,这种队列叫双端队列(Double Ended Queue),学名Deque。

  • Java集合提供了接口Deque来实现一个双端队列,它的功能是:

    • 既可以添加到队尾,也可以添加到队首;
    • 既可以从队首获取,又可以从队尾获取。
      在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值