用队实现栈

本文介绍了一种使用两个队列协作实现栈数据结构的方法。通过将数据存储在一个队列中,然后在需要进行栈操作时,如pop或top,将除最先进队的元素外的所有元素转移到另一个队列,从而实现栈的先进后出特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用队列实现栈的下列操作:

push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空

栈的原理:先进后出;
队的原理:先进先出.

思路:可以考虑用两个队相互协作实现一个栈,在一个队中直接用push存储数据,当要进行pop操作时,将该队中的元素除最先进队的元素外全部导入另一个栈,再对前者进行remove操作,最后将后者中的元素导回前者;top方法与pop方法类似,区别在于前一个栈中剩余的最后一个元素也要存入后一个栈.

package Test;
import java.util.LinkedList;
import java.util.Queue;

public class myStack {

    private Queue<Integer> queue1 = new LinkedList<>();  //用于存放数据
    private Queue<Integer> queue2 = new LinkedList<>();  //用于辅助获取数据(始终为空)

    /** Push element x onto stack. */
    public void push(int x) {
        queue1.offer(x);
    }

    /** Removes the element on top of the stack and returns that element. */
    public Integer pop() {

        //若队列为空
        if (queue1.isEmpty()){
            return null;
        }

        //将队列queue1中除最后一个元素外全部出队并存入queue2
        while(queue1.size() > 1) {
            int ret = queue1.remove();
            queue2.add(ret);
        }

        //获取队列尾部元素,即栈的栈顶元素
        int cur = queue1.remove();
        //交换队列queue1和queue2
        swap();
        return cur;

    }

    //交换队列内容
    private void swap(){
        Queue<Integer> queue3 = queue1;
        queue1 = queue2;
        queue2 = queue3;
    }

    /** Get the top element. */
    public Integer top() {
        //处理队列为空的情况
        if (queue1.isEmpty()){
            return null;
        }

        //将队列queue1中除最后一个元素外的元素出队,并存入queue2
        while(queue1.size() > 1){
            int ret = queue1.remove();
            queue2.add(ret);
        }

        //将队列中最后一个元素,即栈顶元素返回
        int cur = queue1.remove();
        queue2.add(cur);
        swap();
        return cur;
    }

    /** Returns whether the stack is empty. */
    public boolean empty() {
        return queue1.isEmpty();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值