JAVA——用队列实现栈

这篇博客介绍了如何使用两个队列来模拟一个后入先出(LIFO)的栈,详细阐述了push、pop、top和empty四个基本操作的实现过程。在push操作中,根据队列是否为空选择合适的队列压入元素。pop和top操作通过转移队列中的元素来获取栈顶元素,最后返回或删除栈顶元素。整个实现充分利用了队列的特性,巧妙地构造了一个栈的功能。
摘要由CSDN通过智能技术生成

问题:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false。

方法:1.先创建两个队列
2.push(int x)将元素x压入栈顶:要考虑两种情况。第一种两个栈都为空的时候,放到队列1中。第二种情况,哪个队列已有元素就放到哪个队列里。
在这里插入图片描述
3.pop() 移除并返回栈顶元素:首先要判断两个队列是否都为空。然后若队列1不为空 ,则把除最后一个元素(相当于栈顶元素)之外数从队列1中删除的同时移到队列2中,最后再利用e.poll()返回并删除最后一个元素的值(这个不移入队列2)。若队列2不为空则是一样的做法。
注:此模块中在for循环中不可以直接使用i<qu1.size()-1,因为size()每for循环一次就变化一次,因此size()不可以出现在循环条件内
在这里插入图片描述4.top() 返回栈顶元素:在3.的基础上稍加改动,不删除元素了,循环条件直接改为i<size,将有元素的队列全部移入空队列,此时循环完时,e的返回值就是栈顶元素。
在这里插入图片描述
代码:

class MyStack {
     private Queue<Integer> qu1=new LinkedList<>();
     private Queue<Integer> qu2=new LinkedList<>();

    public MyStack() {

    }


    //将元素 x 压入栈顶。
    public void push(int x) {
        if(!qu1.isEmpty()){
            qu1.offer(x);
        }else if(!qu2.isEmpty()){
            qu2.offer(x);
        }else{
            qu1.offer(x);
        }
    }
  //移除并返回栈顶元素。
    public int pop() {
        if(empty()){
            return -1;
        }
        int e=-1;
        if(!qu1.isEmpty()){
            int size= qu1.size();
            for(int i=0;i<size-1;i++){
                e=qu1.poll();
                qu2.offer(e);
            }
            e=qu1.poll();
        }else{
            int size= qu2.size();
            for(int i=0;i<size-1;i++){
                e=qu2.poll();
                qu1.offer(e);
            }
            e=qu2.poll();
        }
        return e;
    }
//返回栈顶元素
    public int top() {
        if(empty()){
            return -1;
        }
        int e=-1;
        if(!qu1.isEmpty()){
            int size= qu1.size();
            for(int i=0;i<size;i++){
                e=qu1.poll();
                qu2.offer(e);
            }
        }else{
            int size= qu2.size();
            for(int i=0;i<size;i++){
                e=qu2.poll();
                qu1.offer(e);
            }
        }
        return e;
    }
//如果栈是空的,返回 true ;否则,返回 false
    public boolean empty() {
      return qu1.isEmpty()&&qu2.isEmpty();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值