题意分析
- 需要我们使用两个栈来模拟队列的操作,比如入队和出队的操作。
- 前置知识,首先,我们来介绍一下栈和队列。
- 栈是一个先进后出的数据结构。
- 队列是一个先进先出的数据结构。
思路分析
写法一 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; }