剑指offer-两个栈实现一个队列

题目:用两个栈实现一个队列,请实现它的两个函数add,remove,分别从队列尾部添加元素,和从队列头部移除元素。

首先我们来回顾下栈和队列的特性,栈的特性是先进后出,即它只能通过一个口出入,如下图,

剑指offer-两个栈实现一个队列

 

队列的特性,先进先出,从队首出队,从对尾入队,如下图

剑指offer-两个栈实现一个队列

 

解题过程

用两个栈来实现一个队列,根据栈和队列的特性,要解决的就是出队列的问题,解决过程如下图,我们称为 栈1和栈2

剑指offer-两个栈实现一个队列

 

这样调用remove方法,我们就可以从"栈2"中一个一个的移除, 1,2,3,4,5,6,7,8。

那么此时来了新的值9,我们直接把它入到"栈1"里面。当调用remove方法到"栈2"无值时,将"栈1"中的值再次转移到"辅助栈2" 中。保证了出队列的顺序和入队列的顺序一样。

代码

import java.util.Stack;
class Queue<T>{
 private Stack<T> pushStack = new Stack<>();// 栈1
 private Stack<T> popStack = new Stack<>();// 栈2辅助栈
 public void addLast(T e) {
     pushStack.push(e);
 }
 /**
 * 删除一个元素并返回
 * @return
 */
 public T removeFirst() {
     transferElement();
     if (!popStack.isEmpty()) {
         return popStack.pop();
     }
     return null;
 }
 /**
 * 返回队列头元素
 * @return
 */
 public T getFirst() {
     transferElement();
     return popStack.peek();
 }
 private void transferElement() {
     if (!popStack.isEmpty()) {
         return;
     }
     while (!pushStack.isEmpty()) {
         popStack.push(pushStack.pop());
     }
 }
 public boolean isEmpty() {
     return pushStack.isEmpty() && popStack.isEmpty();
 }
}

测试代码:

public class QueueAndStack {
 /**
 * 两个栈实现一个队列
 */
 public static void main(String[] args) {
 Queue<Integer> queue = new Queue<>();
 for (int i = 0; i < 10; i ++) {
     queue.addLast(i);
 }
 queue.removeFirst(); // 删除0
 queue.addLast(11);
 queue.removeFirst();// 删除1
 System.out.println(queue.getFirst()); //输出2
 while (!queue.isEmpty()) {
     System.out.print(queue.removeFirst() + " ");
 }
 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值