java---用两个栈实现队列&&用两个队列实现栈

(1)用两个栈实现队列

Java代码

public class QueueImplementByTwoStacks<E> {

    private Stack<E> stack1;//专门用来入队
    private Stack<E> stack2;//专门用来出队
    //队列初始化
    QueueImplementByTwoStacks()
    {
        stack1 = new Stack<E>();
        stack2 = new Stack<E>();
    }

    public int theSize(){return stack1.size()+stack2.size();}

    public void appendTail(E e){ stack1.add(e);}

    public E deleteHead() throws Exception{

    //move stack1 to stack2 
    if(stack2.isEmpty()){   
        while(!stack1.isEmpty()){
            stack2.push(stack1.pop());
        }
    }
    if(stack2.isEmpty()){throw new Exception("Queue is empty!");}
        return stack2.pop();
    }
}

(2)用两个队列实现栈

java 代码

注释pop()方法中的return element;不能写成return queue1.poll();的原因在:http://blog.csdn.net/hungry_bug/article/details/49689637

import java.util.PriorityQueue;
import java.util.Queue;

public class StackImplementByTwoQueues <E>{

    private PriorityQueue<E> queue1 = new PriorityQueue<>();
    private PriorityQueue<E> queue2= new PriorityQueue<>();
    private int size;

//因为java中的Queue是一个接口interface不是一个类class,所以不能创建对象,可以直接拿来使用。
//  StackImplementByTwoQueues (){
//      queue1 = new Queue();
//      queue2 = new Queue();
//  }

    public int theSize(){ return size; }
    public boolean isEmpty(){return size==0;}

    //入栈
    public void push(E e){
        queue1.add(e);
        size++;
        }
    /**
     * 出栈有两种思路: 思路(1):每次拷贝都是将源队列中的全部元素拷贝到目的队列中去,只由一个队列(队列1或者队列2)实现出栈。
     *              思路(2):每次拷贝结束后,源队列都留有最后一个元素,用于出栈。
     */

/*  //出栈方法1:思路(1)
    public E pop(){
        //1.先将队列1中的前queue1.size()-1个元素压入队列2中
        int queue1_Length = queue1.size();//先保存长度,因为队列元素在拷贝时,发生变化。循环的次数也在变化而产生错误。
        for(int i=0;i<queue1_Length-1;i++) {
            E e = queue1.poll();//删除队头的元素,并返回。
            queue2.add(e);
        }

        //2.保存队列1中的最后一个元素
        E element = queue1.poll();

        //3.再将队列2中的所有元素压入队列1中。
        int queeu2_Length = queue2.size();
        for(int j =0;j<queeu2_Length;j++){queue1.add(queue2.poll());}
        size--;
        return element;

    }*/

    //出栈方法2:思路(2)
    public E pop(){

    E element = null;
    if(!queue1.isEmpty()&&queue2.isEmpty()){
        //1.将队列1中除最后一个元素之外的全部元素压入队列2中。
        int queue1_Length = queue1.size();//先保存长度,因为队列元素在拷贝时,发生变化。循环的次数也在变化而产生错误。
        for(int i=0;i<queue1_Length-1;i++) {
            E e = queue1.poll();//删除队头的元素,并返回。
            queue2.add(e);
        }
        //2.保存队列1中的最后一个元素
         element = queue1.poll();
    }
    else if(queue1.isEmpty()&&!queue2.isEmpty()){

        //1.再将队列2中除最后一个元素之外的全部元素压入队列1中。
        int queeu2_Length = queue2.size();
        for(int j =0;j<queeu2_Length-1;j++){queue1.add(queue2.poll());}
        //2.保存队列2中的最后一个元素
        element = queue2.poll();
    }
    size--;
    return element;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值