题解 | 用两个栈实现队列
用两个栈实现队列
https://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6
class Solution { public: void push(int node) { while(!stack1.empty()){ stack2.push(stack1.top()); stack1.pop(); } stack2.push(node); while(!stack2.empty()){ stack1.push(stack2.top()); stack2.pop(); } } int pop() { int res = -1; if(!stack1.empty()){ res = stack1.top(); stack1.pop(); } return res; } private: stack<int> stack1; stack<int> stack2; };
这个方法没有官方题解巧妙,放在这里的目的是警醒和我一样做法的人。
它的问题有两个,一个是pop一般没有push频繁,如果需要在两个栈多次倒换放在pop函数里会更好;
另一个问题是pop也是按队列出队顺序来的,所以原来已经放在作为出队模拟的stack2里不用倒回stack1。
class Solution { public: void push(int node) { stack1.push(node); } int pop() { if(stack2.empty()){ while(!stack1.empty()){ stack2.push(stack1.top()); stack1.pop(); } } int res = stack2.top(); stack2.pop(); return res; } private: stack<int> stack1; stack<int> stack2; };
这是对官方高赞版本的模仿。