题目:用两个队列实现栈。
思路:可能看了我的《用两个栈实现队列》的那篇文章后,很多人都会想到“反向的反向等于正向”的思想,但“正向的正向还是正向”,因此我们不能用上篇文章的思想。在这里,我们要开动脑筋,另辟蹊径。
设有两个队列q1和q2,我们把它看成一个整体,即从外部来看,它就是一个栈。栈的push操作,我们就直接push到s1中就行了。栈的pop操作,将s1中的队列依次取出放到s2中,取到最后一个时,最后一个不要放到s2中,返回其值,再将s2中的值依次还给s1。
注意:我们这里的pop的意思是先返回栈的栈顶元素,然后将其pop出来。而C++中的pop的意思是直接将栈的栈顶元素pop出来,不返回任何值。
源代码:
#include <iostream> #include <queue> using namespace std; class Stack { public: Stack(){}; void Push(int data); int Pop(); bool IsEmpty(); private: queue<int> q1; queue<int> q2; }; void Stack::Push(int data) { q1.push(data); } int Stack::Pop() { while(q1.size() != 1) { q2.push(q1.front()); q1.pop(); } int d = q1.front(); q1.pop(); while(!q2.empty()) { q1.push(q2.front()); q2.pop(); } return d; } bool Stack::IsEmpty() { if(q1.empty() && q2.empty()) return true; return false; } int main() { Stack s; for(int i = 0;i < 6;i++) s.Push(i); cout << s.Pop() << " "; cout << s.Pop() << " "; cout << s.Pop() << " "; s.Push(6); s.Push(7); while(!s.IsEmpty()) cout << s.Pop() << " "; return 0; }
原文地址:http://7876369.blog.51cto.com/7866369/1558038