首页 > 代码库 > 用两个队列实现栈

用两个队列实现栈

题目:用两个队列实现栈。


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

设有两个队列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;
}


用两个队列实现栈