剑指offer第二版-7_2用双队列实现栈

/**
 * 用两个队列实现栈
 * <p>
 * (1)对于插入操作,栈与队列都是从队尾进行,因此很容易完成。但是一定要保证有一个队列是空的
 *(2)对于弹出操作,队列从队头开始,而栈从队尾开始,要想取到队尾元素,需要第二个队列的协助:
 * 假设queue1不为空,queue2为空,将queue1的原书依次取出放到queue2中,同时判断,当queue1的长度为1时,不要将该元素放到queue2中,而是直接取出丢弃,此时即完成了栈的弹出操作
 * 也就是说,弹出一个元素,其他元素的存储位置就会从本队列移动到另一个队列中。
 * <p>
 * 运作过程中,queue,queue2一定至少一个为空。插入操作选择queue1,queue2中不为空的那个队列插入(如果都为空,随意选择一个)
 * 弹出时将不为空的队列除最后一个队列的其他元素依次取出放到另一个队列中,而将最后那一个元素取出丢弃即可
 */
public class P71_StackWithTwoQueues {

	public static void main(String[] args) {
		MyStack<Integer> myStack = new MyStack<>();
		myStack.push(1);
		myStack.push(2);
		myStack.push(3);
		System.out.println(myStack.pop());
		System.out.println(myStack.pop());
		myStack.push(4);
		System.out.println(myStack.pop());
		System.out.println(myStack.pop());
		System.out.println(myStack.pop());
	}
}

class MyStack<T> {
	private Queue<T> queue1 = new LinkedList<>();
	private Queue<T> queue2 = new LinkedList<>();

	public void push(T data) {
		if (!queue2.isEmpty()) {
			queue2.offer(data);
		} else {
			queue1.offer(data);
		}
	}

	public T pop() {
		if (!queue2.isEmpty()) {
			int size = queue2.size();
			for (int i = 0; i < size - 1; i++) {
				queue1.offer(queue2.poll());
			}
			return queue2.poll();
		}
		if (!queue1.isEmpty()) {
			int size = queue1.size();
			for (int i = 0; i < size - 1; i++) {
				queue2.offer(queue1.poll());
			}
			return queue1.poll();
		}

		return null;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值