您的位置:首页 > Web前端

Rhyme/剑指Offer Java 05 用两个栈实现一个队列Java版

2018-01-15 11:55 567 查看

剑指Offer Java 05 用两个栈实现一个队列Java版

package offer5;

import java.util.Stack;

/**
* 用两个栈来实现一个队列,
* 完成队列的push和pop操作
*
* 思路:
*
*  运用栈的特性后进先出
*  那么如果我先将元素放入一个栈A中
*  那么将栈A中的元素pop并push进栈B中
*  那么在栈B执行pop操作,
*  就和在队列中的到的结果相同了
*
* @author RhymeChiang
* @date 2018/01/15
**/
public class Offer5<E> {

private Stack<E> stackIn;
private Stack<E> stackOut;

{
stackIn = new Stack<>();
stackOut = new Stack<>();
}

/**
* 模拟队列的push操作
* <p>
* 先将元素push进stackIn栈中
* 在判断stackOut栈中是否有元素
* <p>
* 如果stackOut栈中有元素则不移动stackIn栈中的元素
* 执行pop操作的时候,pop stackOut栈中的元素
* <p>
* 如果stackIn栈中没有元素则将stackIn中的所有元素pop,
* 并push进stackOut栈中
*
* @param e
*/
public void push(E e) {
// 将元素先压入In栈
stackIn.push(e);
// Out栈中元素为空
// 则将In栈中的元素全部pop
// 并push进Out栈中
if (stackOut.empty()) {
while (!stackIn.empty()) {
stackOut.push(stackIn.pop());
}
}
// 如果Out栈中有元素,则不移动
}

/**
* 模拟队列的pop操作
*
* @return
*/
public E pop() {
// 如果Out栈为空
// 则将In栈的元素pop
// 并push进Out栈中
if (stackOut.empty()) {
while (!stackIn.empty()) {
stackOut.push(stackIn.pop());
}
}
if (!stackOut.empty()) {
return stackOut.pop();
}
return null;
}

public static void main(String[] args) {
Offer5<Integer> offer5 = new Offer5<>();
offer5.push(1);
offer5.push(2);
offer5.push(3);

System.out.println(offer5.pop());
System.out.println(offer5.pop());
System.out.println(offer5.pop());
System.out.println(offer5.pop());
}
}


测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 算法 剑指Offer