方法一:双栈模拟队列
1.结题思路
模拟题,首先根据栈和队列的特性,栈是先进后出,队列是先进先出,不难得知,将数组元素按1,2,3顺序压入栈后,出栈顺序为3,2,1,改变了一次元素先后顺序,而将元素再压入栈后,出栈顺序即与第一次入栈时相同,实现了先入先出。
2.解法
入栈:栈1入栈即为模拟入队。
出栈:栈1在栈2为空的时候,将栈1内元素全部依次出栈再入栈栈2,再出栈2栈顶元素即为出队;在栈2非空的时候,则直接出栈。
3.图解
4.具体代码
class Solution
{
public:
void push(int node) {
stack1.push(node);//用栈1入栈模拟队列入队
}
int pop() {
if(!stack2.empty()){//栈2有元素则直接出栈
int ans=stack2.top();
stack2.pop();
return ans;
}else{//否则将栈1元素出队到栈2,再让栈2顶元素出栈
while(!stack1.empty()){
int temp=stack1.top();
stack1.pop();
stack2.push(temp);
}
int ans=stack2.top();
stack2.pop();
return ans;
}
}
private:
stack<int> stack1;//栈1模拟入队操作
stack<int> stack2;//栈2模拟出队操作
};5.时间复杂度和空间复杂度分析
时间复杂度:O(1),每个元素最多出入栈1栈2各一次,出入栈操作均为O(1)
空间复杂度:O(n),n是模拟队列中的元素个数,用到了栈来存放n个数

京公网安备 11010502036488号