栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【栈和队列专题】—— 双队列模拟栈

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【栈和队列专题】—— 双队列模拟栈

LeetCode 225 : 用队列实现栈 队列

1.一些关于队列的基本操作

  • 向队列中添加元素[3种方法]

queue.add(value)
queue.offer(value)
queue.put(value)

  • 删除队首元素

queue.remove()
queue.poll()
queue.take()

  • 查看队首元素

queue.element()
queue.peek()

  • 判断队列是否为空

queue.isEmpty()

2.队列的实现
(1)可以通过链表来实现队列
(2)可以通过Java中的LinkedList来实现队列
(3)也可以通过栈来模拟队列

队列实现栈

☀️ 解题思路:
(1)用队列模拟栈最重要的就是来完成元素顺序的控制,队列中怎样的元素存储顺序才能和栈相同呢?

(2)栈的主要特点就是后入先出,队列只能通过让实际后入的元素先存储到队列中,这样就满足了后入先出的性质,那么如何才能让后入的元素来先保存到队列中呢?

(3)设置两个队列,一个主队列、一个辅助队列。将新添加的元素保存到辅助队列之中,然后让主队列中的元素全部取出保存到辅助队列中,最后再交换两个队列。这样就保证了实际后入的元素先存储到了队列中。

⛄️ 代码部分:

class MyStack {

    

    //定义两个队列
    Queue queue1;
    Queue queue2;

    public MyStack() {
        
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }
    
    public void push(int x) {
        queue2.add(x);
         //将主队列中的元素取出放到辅助队列中
        while(!queue1.isEmpty()){
            queue2.add(queue1.remove());
        }

        //交换两个队列
        Queue temp = queue1;
        queue1 = queue2;
        queue2 = temp;

    }
    
    public int pop() {
        
        return queue1.remove();
    }
    
    public int top() {
        
        return queue1.element();
    }
    
    public boolean empty() {
        
        return queue1.isEmpty();
    }
}


LeetCode 232:用栈实现队列


 解题思路:

(1)设计两个栈,此处定义为A栈与B栈,通过A栈来完成数据的存储,B栈来完成取出/删除队首元素,利用两个栈共同来判断队列是否为空

(2)对于新入队的元素直接添加到A栈中即可

向栈中添加元素有两种方法
stack.add(value)
stack.push(value)

(3)取出队首元素或删除队首元素

  • 提取出将元素从A栈转移到B栈中的语句封装为一个方法
  • 保证在B栈中,从栈顶到栈底的元素满足元素入队的顺序
  • 对于B栈不为空时,是不能将A栈中的元素转移到B栈的,因为这样会破坏元素的顺序

(4)队列判空

  • 如果A栈与B栈都为空的情况下,那么返回队列为空
  • 元素都转移到了B栈,那么为什么不直接用B栈是否为空来决定队列是否为空呢?

因为此时可能A栈中有一部分元素没有转移到B栈中[对于B栈不为空时,不能转移元素]

 代码部分:

class MyQueue {

    Stack stack1;
    Stack stack2;

    public void stackRemove(){
        if(stack2.isEmpty()){
            while(!stack1.isEmpty()){
            stack2.push(stack1.pop());
            }
        }
    }
    
    public MyQueue() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }
    
    public void push(int x) {
        stack1.push(x);
    }
    
    public int pop() {
        stackRemove();        
        return stack2.pop();
    }
    
    public int peek() {
        stackRemove();
        return stack2.peek();
    }
    
    public boolean empty() {
        
        return stack2.isEmpty() && stack1.isEmpty();
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/820948.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号