您的位置:首页 > 编程语言 > Java开发

2个队列实现一个栈

2016-05-19 00:47 405 查看
在算法导论有一道非常有趣的证明题, 利用2个队列实现一个栈, 队列和栈最大的区别就是队列满足FIFO(先进先出),他有2个操作的地方,一个是队头一个是队尾,

而栈满足的是先进后出,他只有一个操作的地方就是栈顶。

我们定义2个队列
queue1 queue2 用于存放进"栈" 用queue2临时存
放queue1的数据。

那么实现他的方式就比较明显了, 首先我们先抽象的想象一下,我们封住队列的一个一端,元素进“栈”的话,直接让他进去queue1队列

对于出“栈”,把queue1的除开最后一个元素的其余的元素转移到queue2中
,然后把刚才剩下queue1中的那个元素出队列(Stack.pop)。之后把q2中的全部元素转移回q1中。

比如queue1中有三个数据c b a. 那么我们把除开最后一个c以外的2个元素 b, a元素移到queue2. 如果这个时候用户出栈的话,

那么请问是不是就只有c了? c就是栈顶。 c pop出去, 接着如果在执行出栈的话,我们在把queue2中除最后一个元素的元素

移到queue1 请问是不是只有b了? 那么执行pop就是出去b。



下面给出Java实现代码:

import java.util.Queue;

public class Test_Queue {
Queue<integer> queue1 = new ArrayDeque<>();
Queue<integer> queue2 = new ArrayDeque<>();

public void push(int node) {
//两个栈都为空时,优先考虑queue1
if (queue1.isEmpty()&&queue2.isEmpty()) {
queue1.add(node);
return;
}

//如果queue1为空,queue2有元素,直接放入queue2
if (queue1.isEmpty()) {
queue2.add(node);
return;
}

if (queue2.isEmpty()) {
queue1.add(node);
return;
}

}

public int pop() {
//两个栈都为空时,没有元素可以弹出
if (queue1.isEmpty()&&queue2.isEmpty()) {
try {
throw new Exception(stack is empty);
} catch (Exception e) {
}
}
//如果queue1为空,queue2有元素, 将queue2的元素依次放入queue1中,直到最后一个元素,我们弹出。
if (queue1.isEmpty()) {
while (queue2.size()>1) {
queue1.add(queue2.poll());
}
return queue2.poll();
}

if (queue2.isEmpty()) {
while (queue1.size()>1) {
queue2.add(queue1.poll());
}
return queue1.poll();
}

return (Integer) null;
}

public static void main(String[] args) {
Test_Queue   test_Queue = new  Test_Queue ();
test_Queue.push(9);
test_Queue.push(8);
test_Queue.push(7);
test_Queue.push(6);
System.out.println(test_Queue.pop());
System.out.println(test_Queue.pop());
demo08.push(5);
System.out.println(test_Queue.pop());
System.out.println(test_Queue.pop());
System.out.println(dtest_Queue.pop());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 java 算法导论