用两个栈实现队列 用队列实现栈 java
用两个栈实现队列 & 用队列实现栈 java
用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
class CQueue {
public CQueue() {}
public void appendTail(int value) {}
public int deleteHead() {}
}
我们首先知道栈(stack)和队列(queue)的性质:栈是先进后出,队列是先进先出。
因此两个栈的性质相互叠加,进一个栈后再进一次栈,栈顶元素就是最初入栈的那个数了,就达到了队列的性质。
另外代码实现时要分类讨论,当两个栈都为空时,返回-1;当右边栈不为空,直接出栈顶元素;当右边栈为空,左边不为空,遍历左边的栈都放到右边的栈中。
代码实现:
public class CQueue {
// 只管入栈
private Stack stackIn;
// 只管出栈
private Stack stackOut;
public CQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
public void appendTail(int value) {
stackIn.push(value);
}
public int deleteHead() {
if (stackOut.isEmpty()) {
if (stackIn.isEmpty())
return -1;
else
while (!stackIn.isEmpty())
stackOut.push(stackIn.pop());
}
return stackOut.pop();
}
}
相关题目:用队列实现栈
使用队列实现栈的下列操作:
push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空
我们同样可以使用两个队列 来实现一个栈,由于两个队列都是先进先出的性质,我们可以让队列中之前所有的数都出队放到另一个队列中,从而获得最后一个入队的元素。
代码实现:
public class MyStack {
private Queue queue1;
private Queue queue2;
public MyStack() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
/** Push element x onto stack. */
public void push(int x) {
queue1.add(x);
}
public int pop() {
while (queue1.size() > 1) // 长度为1时退出循环,保留一个元素
queue2.add(queue1.poll());
int res = queue1.poll(); // 取出剩下的元素
while (queue2.size() > 0) // 把所有元素都写回到queue1
queue1.add(queue2.poll());
return res;
}
public int top() {
while (queue1.size() > 1)
queue2.add(queue1.poll());
int res = queue1.poll();
queue2.add(res);
while (queue2.size() > 0)
queue1.add(queue2.poll());
return res;
}
public boolean empty() {
return queue1.isEmpty(); // 只需要判断queue1是否为空
}
}
优化代码,发现可以只用一个queue就能实现。上面代码中while循环不能再使用因为在原队列进行操作不会减少队列的size,从而导致死循环。
public class MyStack1 {
private Queue queue1;
public MyStack1() {
queue1 = new LinkedList<>();
}
public void push(int x) {
queue1.add(x);
}
public int pop() {
for (int i = 0; i < queue1.size() - 1; i++) // 用for循环代替while遍历
queue1.add(queue1.poll()); // 从queue1队首出队,从queue1队尾入队
return queue1.poll(); // 拿到第size个元素
}
public int top() {
for (int i = 0; i < queue1.size() - 1; i++)
queue1.add(queue1.poll());
int res = queue1.poll();
queue1.add(res);
return res;
}
public boolean empty() {
return queue1.isEmpty();
}
}
也可以在入栈操作的时候就将插入的数移动到栈首,使得代码更加简洁。
public class MyStack2 {
private Queue queue;
public MyStack2() {
queue = new LinkedList<>();
}
public void push(int x) {
queue.add(x);
for (int i = queue.size() - 1; i > 0; i--)
queue.add(queue.poll());
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.isEmpty();
}
}
用两个栈实现队列 用队列实现栈 java相关教程