解題思路
隊列的特性:先進先出
棧的特性:先進後出
在解決用棧實現隊列問題時,利用的是兩個棧,採用的是利用輔助棧來實現隊列的功能。因此對於此題也可以使用此思想。
利用兩個隊列,一個作爲輸入隊列inputQ,一個作爲輸出隊列outputQ。
- 對於MyStack.push()操作,由inputQ完成
- 對於MyStack.pop()操作,由於棧的先進後出特性,可以使inputQ不斷的pop,並將其值壓回到outputQ,直到inputQ.size()==1即爲此時應該出棧的元素,記錄下來。
- 之後再把outputQ中的元素壓回到inputQ中(可使用inputQ=outputQ完成該操作),outputQ清空,至此該過程結束。
- 對於MyStack.top()操作,類似於pop,只不過把可以進行簡化一下,對inputQ不斷pop,並記錄front,直達爲空,同時將該值壓回到outputQ。之後把outputQ賦值給inputQ即可。
對於MyStack.empty()操作,判斷inputQ是否爲空即可。
代碼
class MyStack {
public:
/** Initialize your data structure here. */
deque<int> inputQ;
deque<int> outputQ;
MyStack() {
}
/** Push element x onto stack. */
void push(int x) {
inputQ.push_back(x);
}
/** Removes the element on top of the stack and returns that element. */
int pop() {
int popNum=0;
if (!inputQ.empty())
{
while (inputQ.size()!=1)
{
outputQ.push_back(inputQ.front());
inputQ.pop_front();
}
popNum = inputQ.front();
inputQ.pop_front();
inputQ = outputQ;
outputQ.clear();
}
return popNum;
}
/** Get the top element. */
int top() {
int popNum = 0;
if (!inputQ.empty())
{
while (!inputQ.empty())
{
popNum = inputQ.front();
outputQ.push_back(inputQ.front());
inputQ.pop_front();
}
inputQ = outputQ;
outputQ.clear();
}
return popNum;
}
/** Returns whether the stack is empty. */
bool empty() {
if (inputQ.empty()) return true;
else return false;
}
};