用两个队列实现一个栈

Posted 穿迷彩服的鲨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用两个队列实现一个栈相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include<queue>
using namespace std;

template<typename T> class MyQueue
{
public:
	MyQueue(void);
	~MyQueue(void);
	void appendTail(const T& node);
	T deleteHead();
	void Print();
private:
	queue<T> queue1;
	queue<T> queue2;
};
template<typename T>
MyQueue<T>::MyQueue(void)
{
}
template<typename T>
MyQueue<T>::~MyQueue(void)
{
}
template<typename T>
void MyQueue<T>::appendTail(const T& node)
{
	//数据的插入原则:保持一个队列为空,一个队列不为空,往不为空的队列中插入元素
	if (!queue1.empty())
	{
		queue1.push(node);
	}
	else
	{
		queue2.push(node);
	}
}
template<typename T>
T MyQueue<T>::deleteHead()
{
	T result = 0;
	if (!queue1.empty())
	{
		while (queue1.size() > 1)
		{
			T& data = queue1.front();
			queue1.pop();
			queue2.push(data);
		}
		if (queue1.empty())
		{
			throw new exception("queue is empty");
		}
		result = queue1.front();
		queue1.pop();
	}
	else
	{
		while (queue2.size() > 1)
		{
			T& data = queue2.front();
			queue2.pop();
			queue1.push(data);
		}
		if (queue2.empty())
		{
			throw new exception("queue is empty");
		}
		result = queue2.front();
		queue2.pop();
	}
	return result;
}

template<typename T>
void MyQueue<T>::Print()
{
	if (!queue1.empty())
	{
		int len = queue1.size();
		for (int i = 0; i < len; ++i)
		{
			cout << queue1.front() << " ";
			queue1.push(queue1.front());
			queue1.pop();
		}
	}
	else if (!queue2.empty())
	{
		int len = queue2.size();
		for (int i = 0; i < len; ++i)
		{
			cout << queue2.front() << " ";
			queue2.push(queue2.front());
			queue2.pop();
		}
	}
}



int main()
{
	MyQueue<int> queue;
	cout << "往栈中添加元素:1 2 3" << endl;
	queue.appendTail(1);
	queue.appendTail(2);
	queue.appendTail(3);
	cout << "添加后栈内元素:";
	queue.Print();

	cout << endl << endl;

	int data = queue.deleteHead();
	cout << "删除的栈尾元素:" << data << endl;
	cout << "删除后的栈元素:";
	queue.Print();

	cout << endl << endl;

	cout << "往栈中添加元素:10 12" << endl;
	queue.appendTail(10);
	queue.appendTail(12);
	cout << "添加后:";
	queue.Print();

	cout << endl << endl;

	int data1 = queue.deleteHead();
	cout << "删除的栈尾元素:" << data1 << endl;
	cout << "删除后的栈元素:";
	queue.Print();

	cout << endl << endl;

	return 0;
}




传送门:用两个栈实现一个栈

以上是关于用两个队列实现一个栈的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-用两个栈实现队列

用两个栈实现一个队列

用两个栈实现一个队列(C++)

[剑指offer]面试题7:用两个栈实现队列

剑指offer用两个栈实现队列

剑指offer:用两个栈实现一个队列