java:用两个队列实现栈

题目:利用两个队列模拟栈,分析图如下: 

  1. abcd一次进入队列模拟进入栈;
  2. 进行出栈操作,表示d要出栈,根据队列的先进先出原则,只有abc依次出队列d才有机会出队列,所以abc从queue01出队列到queue02,d出队列实现出栈操作;
  3. 元素ef需要进栈,直接进入到queue01队列即可;
  4. 进行出栈操作,表示f需要出栈,此时将e出队列进去到queue02,f出队列达到出栈效果。

注:如果第五步需要进行出栈操作,则需要将queue02的元素都出队列到queue01,剩下最后一个元素e出queue02队列实现出栈操作。

代码实现如下: 

package com.example.offer;

import java.util.LinkedList;
import java.util.Queue;

public class TestMyStack {
    public static void main(String[] args) {
        MyStack<String> myStack=new MyStack<>();
        myStack.push("我");
        myStack.push("爱");
        myStack.push("学习");
        myStack.push("吗");
        myStack.pop();
        myStack.pop();
        myStack.push("游戏");
        while (myStack.size()>0){
            System.out.println(myStack.pop());
        }
    }
}

/**
 * 利用两个队列实现栈
 */
 class MyStack<T>{
     private Queue queue01=new LinkedList();//用于入栈
     private Queue queue02=new LinkedList();//用于出栈

    /**
     * 实现出栈操作:出栈操作比进栈操作麻烦点
     * @return
     */
     public T pop(){
         //如果queue01和queue02都为空,则模拟栈中为空
         if(queue01.isEmpty() && queue02.isEmpty()){
             return null;
         }
         //如果queue01不为空,且size>1 先出队列,剩最后一个元素为要出栈的元素
         while(!queue01.isEmpty()){
             if(queue01.size()<=1){
                 return (T)queue01.poll();
             }else{
                 queue02.offer(queue01.poll());
             }
         }
         //如果queue01为空queue02不为空 则将queue2的元素出队列,进到queue01 剩最后一个元素为需要出栈的元素
         if(queue01.isEmpty() && !queue02.isEmpty()){
             while(!queue02.isEmpty()){
                 if(queue02.size()<=1){
                     return (T)queue02.poll();
                 }else{
                     queue01.offer(queue02.poll());
                 }
             }
         }
         return null;
     }

    /**
     * 实现入栈操作
     *
     * @param node
     */
     public void push(T node){
         queue01.offer(node);
     }

    /**
     * 模拟栈的大小
     * @return
     */
     public int size(){
         return queue01.size()+queue02.size();
     }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值