题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
设两个栈为stack1,stack2;
1:首先想到最简单的方法:是入栈时将数据压入stack1,出栈时将stack1中的元素出栈压入stack2,在将stack2栈顶元素弹出,再将stack2中的剩余元素重新压入stack1,
这种方法很低效可想而知。
2:改进一下:入栈时检查stack1,如果stack1为空则元素全在stack2中,所以将stack2中的元素压入stack1中(记得检查stack2是否为空),再将元素入栈,如果stack1不为空直接将元素压入栈,同样出栈时检查stack2,如果为空将stack1中的元素压入stack2再将栈顶元素出栈,如果不为空直接将栈顶元素出栈。
方法2的c++代码实现:
class Solution{public: void push(int node) { if (stack1.size() != 0) stack1.push(node); else{ int n = (int)stack2.size(); for (int i = 0; i < n; i++){ stack1.push(stack2.top()); stack2.pop(); } stack1.push(node); } } int pop() { if (stack2.size() != 0) { int temp = stack2.top(); stack2.pop(); return temp; } else { int n = (int)stack1.size(); for (int i = 0; i < n - 1; i++){ stack2.push(stack1.top()); stack1.pop(); } int temp =stack1.top(); stack1.pop(); return temp; } } private: stack stack1; stack stack2;};
在网上找到一种更高效的方法:入栈时直接将元素压入stack1,出栈时检查stack2,如果为空将stack1中的元素压入stack2,如果不为空直接将stack2栈顶元素出栈,很巧妙
class Solution{public: void push(int node) { stack1.push(node); } int pop() { int temp; if (!stack2.empty()) { temp = stack2.top(); stack2.pop(); return temp; } else { int n = stack1.size(); for (int i = 0; i < n; i++){ stack2.push(stack1.top()); stack1.pop(); } temp = stack2.top(); stack2.pop(); return temp; } }