二.队列和栈的相互实现

1.用栈实现队列

分析:栈的数据操作是后进先出,队列的操作是先进先出,所以我们想要达成目的,可以用一个辅助的栈;

流程:有两个栈,一个是用于添加数据的pushStack,一个是用于弹出数据的popStack;当需要添加数据时,直接加入到pushStack;当需要弹出数据时(队列弹出数据先进先出,所以目的是弹出pushStack栈底的数据),但是我们只能弹出栈顶的元素,这个时候依次弹出pushStack的栈顶元素,压入到popStack中,这个时候pushStack的栈底元素就变成了popStack的栈顶元素,我们再弹出popStack的栈顶元素,就达到了目的。

//两个栈实现队列结构,用到了java.util.stack里面的pop,push,peek方法
public static class TwoStackQueue{
    private Stack<Integer> stackPush;
	private Stack<Integer> stackPop;

    //1.构造函数中初始化好两个栈
	public TwoStackQueue(){
		stackPush=new Stack<>();
		stackPop=new Stack<>();
	}

    //2.队列中添加元素
    public void push(int i){
        stackPush.push(i);
    }

    //3.队列中删除输出第一个元素
    public int poll(){
        if(stackPush.isEmpty()&&stackPop.isEmpty()){
            throw new RuntimeException("队列为空");
        }
        else if(stackPop.isEmpty()){
            while(!stackPush.isEmpty()){
                stackPop.push(StackPush.pop());
            }
        }
        return stackPop.pop();
    }

    //4.队列中不删除输出第一个元素
     public int poll(){
        if(stackPush.isEmpty()&&stackPop.isEmpty()){
            throw new RuntimeException("队列为空");
        }
        else if(stackPop.isEmpty()){
            while(!stackPush.isEmpty()){
                stackPop.push(StackPush.pop());
            }
        }
        return stackPop.peek();
    }
}

2.用队列实现栈

分析:队列的操作是先进先出,栈的数据操作是后进先出,所以我们想要达成目的,可以用一个辅助的队列;

流程:有两个队列,一个是用于添加数据的队列queue,一个是用来作为帮助的队列help;当要添加数据的时候,直接添加到queue中;当需要弹出数据的时候(栈是后进先出,我们想要弹出的是queue的尾部的元素,但是因为是队列先进先出,我们只能弹出头部的元素,所以我们的目的是让queue中的尾部的元素变为他的头部元素。),就留下他的尾部元素之外的所有元素添加到help队列中,弹出数据,然后help和queue交换(为了保证queue指向的是数据,而此时数据全部都在队列);

//queue(队列) deque(双向队列) linkedList(实现了deque接口)
//poll方法 获取并且移除列表中第一个元素
public static class TwoQueueStack{
    private Queue<Integer> queue;
    private Queue<Integer> help;
    
    //1.构造方法初始化这两个队列
    public TwoQueueStack(){
        queue=new LinkedList<>();
        help=new LinkedList<>();
    }

    //2.添加元素
    public void push(int i){
        queue.add(i);
    }

    //3.弹出并且删除元素(对应与栈的pop操作)
    public int pop(){
        if(queue.isEmpty()){
            throw new RuntimeException("栈是空的");
        }
        while(queue.size()>1){
            help.add(queue.poll());
        }
        int res=queue.poll();
        swap();
        return res;
    }

     //4.弹出但是不删除元素(对应于栈的peek操作)
    public int peek(){
        if(queue.isEmpty()){
            throw new RuntimeException("栈是空的");
        }
        while(queue.size()!=1){
            help.add(queue.poll());
        }
        int res=queue.poll();
        help.add(res);
        swap();
        return res;
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值