题意分析
- 需要我们使用两个栈来模拟队列的操作,比如入队和出队的操作。
- 前置知识,首先,我们来介绍一下栈和队列。
- 栈是一个先进后出的数据结构。
- 队列是一个先进先出的数据结构。
思路分析
写法一 C++版
- 现在,题目要我们用两个栈来模拟一个队列的入队和出队的操作。那么我们可以先看一下一个队列想要入队,那么就可以需要将这个数字保存到队伍的尾部。我们可以这样来看,当我们出队的时候,我们需要将目前队伍中最早入队的弹出去。我们规定两个栈,一个stack1,另一个是stack2,当我们入队的时候,我们先将数字正常放入我们的stack1里面,然后当我们出队的时候,那么此时我们的stack1的最下面的那个数字就需要弹出去,那么我们怎么弹出去呢?我们就需要将这个数字上面的所有的数字从栈里面弹出保存起来。我们可以将这些数字弹出保存到另外一个栈里面。这样这个栈的出栈的顺序就是我们的队列出队的顺序。
所以,我们遇到出队的情况,我们就判断stack2里面是否为空,如果不为空那么直接抛出栈顶的就可以了,否则,我们将stack1里面的数字先放入stack2里面,然后再抛出栈顶的。这里的stack1我理解的是一个缓冲区的功能,只有遇到stack2为空的时候才需要弹出元素。 - 代码如下
- 入栈的时间复杂度为O(1),因为只要进行一个push操作就行了,但是出栈的时间复杂度为时间复杂度为O(n),因为当我们的stack2为空的时候,需要将stack1的所有的结点都进行一个出栈。
- 需要开stack存储暂时入栈的所有的数字,空间复杂度为O(n)
class Solution
{
public:
// stack1用来存储我们的入栈的数字
void push(int node) {
stack1.push(node);
}
int pop() {
// 先判断stack2里面是否有可以出栈的数字了,没有的话那么就直接从stack1里面弹出
if(stack2.empty()){
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
}
int ans=stack2.top();
stack2.pop();
return ans;
}
private:
stack<int> stack1;
stack<int> stack2;
};写法二 Go语言版
思路和上面的一样
代码如下
- 入栈的时间复杂度为O(1),因为只要进行一个push操作就行了,但是出栈的时间复杂度为时间复杂度为O(n),因为当我们的stack2为空的时候,需要将stack1的所有的结点都进行一个出栈。
- 需要开stack存储暂时入栈的所有的数字,空间复杂度为O(n)
package main
var stack1 [] int
var stack2 [] int
func Push(node int) {
// 将数字放入stack1里面
stack1=append(stack1,node);
}
func Pop() int{
// 判断stack2里面还有数字
if len(stack2)==0 {
// 将stack1里面的数字都放到stack2里面
for len(stack1) != 0 {
stack2 = append(stack2,stack1[len(stack1)-1])
stack1 = stack1[:len(stack1)-1]
}
}
// 将stack2里面的最后一个元素拿出
ans := stack2[len(stack2)-1]
stack2 = stack2[:len(stack2)-1]
return ans;
}
京公网安备 11010502036488号