您的位置:首页 > 产品设计 > UI/UE

使用栈Stack实现队列Queue

2014-09-26 15:58 447 查看
如何只使用stack实现queue呢?由于stack是现进后出(FILO),而queue是先进先出的(FIFO)。也就是说stack进行了一次反向,进行两次反向就能实现queue的功能,所以可以用两个stack实现queue。

假设两个栈inStack和outStack,且都为空。可以认为onStack提供入队的功能,栈outStack提供出队的功能。下面是入队和出队的具体算法:

(1)如果栈outStack不为空,直接弹出栈outStack顶部的数据;

(2)如果栈outStack为空,则依次弹出栈inStack的数据,放入栈outStack中,再弹出栈outStack顶部的数据;

实现的代码:
/**
* 使用两个栈来模拟队列
*
* @param <T>
*
*/
public  class SimulationQueue<T> {
private Stack<T> inStack;
private Stack<T> outStack;

public SimulationQueue() {
inStack = new Stack<T>();
outStack = new Stack<T>();
}

/**
* 入队
*
* @param t
*/
public void enqueue(T t) {
inStack.push(t);
}

/**
* 出队
*/
public T dequeue() {
T temp = null;
if (!outStack.isEmpty()) {
temp = outStack.pop();
} else {

while (!inStack.isEmpty()) {
temp = inStack.pop();
outStack.push(temp);
}

if (!outStack.isEmpty()) {
temp = outStack.pop();
}
}
return temp;
}

/**
* 队列是否为空
*
* @return
*/
public boolean isEmpty() {
return inStack.isEmpty() && outStack.isEmpty();
}

/**
* 清空队列
*/
public void clear() {
inStack.clear();
outStack.clear();
}
}


测试代码:

public static void main(String[] args) {
SimulationQueue<String> queue = new SimulationQueue<String>();
queue.enqueue("a");
queue.enqueue("b");
queue.enqueue("c");
queue.enqueue("d");
while(!queue.isEmpty()){
System.out.println("当前出队元素:"+queue.dequeue());
}
}


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