剑指 Offer 09. 用两个栈实现队列

转载自Leet Code《剑指Offer》

题目描述

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

示例

输入:

1
2
>["CQueue","appendTail","deleteHead","deleteHead"]
>[[],[3],[],[]]

输出:[null,null,3,-1]

输入:

1
2
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]

输出:[null,-1,null,null,5,2]

提示:

  • 1 <= values <= 10000
  • 最多会对 appendTaildeleteHead 进行 10000 次调用

我的思路

用两个栈stackAstackB来实现队列的先进先出特性。 思路是:总是从stackA中出队,即保持stackA的栈顶总是队首元素。

首先考虑入队。 如果栈stackAstackB都是空的情况下,则将新的值压入栈stackA;否则压入栈stackB

接下来考虑出队。 如果两个栈都为空,则表明已经到达队尾,返回-1。 如果栈stackA不为空,则stackA的栈顶元素应该是当前的队首元素,将其弹出。

在出队操作后,stackA可能为空。 此时,若stackB中还有元素,则将其依次弹出并压入栈stackA中。 由于栈先进后出的特性,被压入stackA中的元素序列再一次被弹出时,将会符合队列先进先出的顺序。


我的代码

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class MyCQueue 
{
Stack<Integer> stackA;
Stack<Integer> stackB;

public MyCQueue()
{
stackA = new Stack(); stackB = new Stack();
}

public void appendTail(int value)
{
if (stackA.isEmpty()&&stackB.isEmpty())
stackA.add(value);
else
stackB.add(value);
}

public int deleteHead()
{
int val = -1;

if (stackA.isEmpty()&&stackB.isEmpty())
val = -1;
else if (!stackA.isEmpty())
val = stackA.pop();

if (stackA.isEmpty())
while (!stackB.isEmpty())
stackA.push(stackB.pop());

return val;
}
}