题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
栈和队列
解题前我们先来了解下什么是栈和队列
栈是限制插入和删除只能在一个位置上进行的表,是后进先出
表,比如,在栈中依次插入1,2,3,4(由栈顶插入),如下图所示。由于栈是限制只能在一个位置上进行操作,所以删除(弹出)也只能在栈顶进行,即弹出顺序为4,3,2,1。正好是最后插入4的最先弹出,最先插入的1最后弹出。
队列是插入在一端进行而删除在另一端进行的表,是先进先出
表,比如依次在队列中插入1,2,3,4(这里是从队尾插入)。如下图所示。由于删除只能在另一端即队头(队首)进行,所以出队顺序为1,2,3,4。可以看到最先入队的1是最先出队,最后入队的4也是最后出队。
解法
题目要求是用两个栈来模拟一个队列。栈的特性是后进先出,队列的特性是先进先出,可以发现他们的顺序刚好是相反的。那么自然就想到相反的相反的就是对的顺序了。举个例子,仍然是往栈A中依次插入1,2,3,4,此时它的弹出顺序是4,3,2,1。若再将这个弹出顺序4,3,2,1,依次插入到栈B中,此时栈B的弹出顺序就是1,2,3,4,对于最开始插入的1,2,3,4序列刚好满足了先进先出的特性。
实现代码
using System.Collections.Generic;
class Solution
{
Stack<int> pushStack = new Stack<int>();
Stack<int> popStack = new Stack<int>();
// 入队
public void push(int node)
{
pushStack.Push(node);
}
// 出队
public int pop()
{
if (popStack.Count <= 0)
{
while(pushStack.Count > 0)
{
// 在出队时,先将pushStack中元素依次弹出并插入到popStack中
popStack.Push(pushStack.Pop());
}
}
// 再通过popStack弹出
return popStack.Pop();
}
}
更多题目的完整描述,AC代码,以及解题思路请参考这里https://github.com/iwiniwin/Algorithm