~使用两个队列实现一个栈~

栈和队列最常考的面试题之一:  使用两个队列实现一个栈

主要思路:

1)建立两个队列input与output,其中input用于入栈,output用于出栈;

2)当元素要入栈时,直接当元素压入input中;

3)当元素要出栈时,先判断output中是否有元素。若是有,可以直接将output中的栈顶元素出队列;若是没有,则先将input中的元素入到output中,再判断栈是否为空,若不为空,将output的元素除队尾元素外入到input中,再将output中的栈顶元素出队列;

4)判断队列是否为空,依次判断input与output是否为空,若有其中一个栈不为空,则队列就不为空;

5)求栈顶元素,首先判断栈是否为空,若不为空,将input中的元素入到output中,若output不为空,则打印output队尾元素;

6)求队列的大小,将队列input与output的大小相加即可。

 

完整的源代码及测试用例如下:

#include <queue>

template <class T>
class Two_Queue_To_Stack
{
public:
	//插入
	void Push(const T& x)
	{
		input.push(x);
	}

	//删除
	void Pop()
	{
		if(!output.empty())
		{
			output.pop();
		}
		else
		{
			while(!input.empty())
			{
				output.push(input.front());
				input.pop();
			}

			if(!Empty())
			{
				while(output.size() - 1)
				{
					input.push(output.front());
					output.pop();
				}

				output.pop();
			}
			else
			{
				cout<<"删除时发现该队列为空"<<endl;
			}
		}
	}

	//判空
	bool Empty()
	{
		if(!(input.empty() && output.empty()))
		{
			return false;
		}

		return true;
	}

	//栈顶
	void Top()
	//T& Top()
	{
		if(!Empty())
		{
			while(!input.empty())
			{
				output.push(input.front());
				input.pop();
			}

			if(!output.empty())
			{
				//return output.top();
				cout<<"栈顶: "<<output.back()<<endl;
			}
		}
		else
		{
			cout<<"求栈顶时发现该队列为空"<<endl;
		}
	}

	//大小
	size_t Size()
	{
		return input.size() + output.size();
	}

	//打印
	void Printf()
	{
		if(!Empty())
		{
			cout<<Top()<<" ";
			Pop();
		}

		cout<<endl;
	}
protected:
	queue<T> input;
	queue<T> output;
};

void TestTwo_Queue_To_Stack()
{
	Two_Queue_To_Stack<int> q;

	q.Push(1);
	q.Push(2);
	q.Push(3);
	q.Push(4);
	q.Push(5);
	//q.Printf();

	q.Pop();
	q.Pop();
	q.Pop();
	//q.Pop();
	//q.Pop();
	//q.Pop();
	//q.Printf();

	cout<<"Empty: "<<q.Empty()<<endl;
	//cout<<"Top: "<<q.Top()<<endl;
	q.Top();
	cout<<"Size: "<<q.Size()<<endl;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值