题目:用两个队列实现栈。
思路:可能看了我的《用两个栈实现队列》的那篇文章后,很多人都会想到“反向的反向等于正向”的思想,但“正向的正向还是正向”,因此我们不能用上篇文章的思想。在这里,我们要开动脑筋,另辟蹊径。
设有两个队列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