java 队列 栈 实现,用两个栈实现队列 用队列实现栈 java

用两个栈实现队列 用队列实现栈 java

用两个栈实现队列 & 用队列实现栈 java

用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

class CQueue {

public CQueue() {}

public void appendTail(int value) {}

public int deleteHead() {}

}

我们首先知道栈(stack)和队列(queue)的性质:栈是先进后出,队列是先进先出。

因此两个栈的性质相互叠加,进一个栈后再进一次栈,栈顶元素就是最初入栈的那个数了,就达到了队列的性质。

另外代码实现时要分类讨论,当两个栈都为空时,返回-1;当右边栈不为空,直接出栈顶元素;当右边栈为空,左边不为空,遍历左边的栈都放到右边的栈中。

844df806795e1697565d268512383bf2.png

代码实现:

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() – 返回栈是否为空

我们同样可以使用两个队列 来实现一个栈,由于两个队列都是先进先出的性质,我们可以让队列中之前所有的数都出队放到另一个队列中,从而获得最后一个入队的元素。

52e6f44c6fbff0e2942256dc8a7caf4f.png

代码实现:

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相关教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值