剑指 Offer(第2版)面试题 9:用两个栈实现队列
- 剑指 Offer(第2版)面试题 9:用两个栈实现队列
- 解法1:模拟
- 拓展:用队列模拟栈
剑指 Offer(第2版)面试题 9:用两个栈实现队列
题目来源:20. 用两个栈实现队列
解法1:模拟
我们用 C++ 模拟用栈实现队列。
设置两个栈:将一个栈当作输入栈,用于压入 push 传入的数据。另一个栈当作输出栈,用于 pop 和 peek 操作。
每次 pop 或 peek 时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。
代码:
class MyQueue
{
private:
// 定义两个栈:输入栈inStack,输出栈outStack
stack<int> inStack, outStack;
// 将输入栈的元素全部依次压入输出栈
void shift()
{
while (!inStack.empty())
{
int x = inStack.top();
outStack.push(x);
inStack.pop();
}
}
public:
/** Initialize your data structure here. */
MyQueue()
{
}
/** Push element x to the back of queue. */
void push(int x)
{
inStack.push(x);
}
/** Removes the element from in front of queue and returns that element. */
int pop()
{
if (outStack.empty())
shift();
int x = outStack.top();
outStack.pop();
return x;
}
/** Get the front element. */
int peek()
{
if (outStack.empty())
shift();
return outStack.top();
}
/** Returns whether the queue is empty. */
bool empty()
{
if (inStack.empty() && outStack.empty())
return true;
else
return false;
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* bool param_4 = obj.empty();
*/
复杂度分析:
时间复杂度:
空间复杂度:O(n)。
拓展:用队列模拟栈
链接:Leetcode225. 用队列实现栈