加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

【数据结构】栈面试题--两个队列实现一个栈

发布时间:2020-12-15 05:57:20 所属栏目:安全 来源:网络整理
导读:上篇文章写了用两个栈实现一个队列,这篇文章实现用两个队列实现一个栈,其实两者的思想都是差不多的。 下边继续画图说明: 下边给出实现代码: #includequeuetemplatetypename Tclass Stack{public:void Push(const T x){//q1,q2都为空,push进q1if (_q1.em

上篇文章写了用两个栈实现一个队列,这篇文章实现用两个队列实现一个栈,其实两者的思想都是差不多的。

下边继续画图说明:


下边给出实现代码:

#include<queue>
template<typename T>
class Stack
{
public:
	void Push(const T& x)
	{
		//q1,q2都为空,push进q1
		if (_q1.empty()&&_q2.empty())
		{
			_q1.push(x);
		}
		else if (!_q1.empty())//q1不空就push进q1
		{
			_q1.push(x);
		}
		//q1空,q2不空(直接放入q1,这样pop的话可能更方便一些),要是之后还需要push就不方便了
		else//q2不空,push进q2
		{
			_q2.push(x);
		}
	}
	T Pop()
	{
		if (_q1. empty() && _q2.empty())
		{
			exit(EXIT_FAILURE);
		}
		if (!_q1.empty())
		{
			while (_q1.size() != 1)
			{
				T tmp = _q1.front();
				_q1.pop();
				_q2.push(tmp);
			}
			T  ret = _q1.front();
			_q1.pop();
			return ret;
		}
		if (!_q2.empty())
		{
			while (_q2.size() != 1)
			{
				T tmp = _q2.front();
				_q2.pop();
				_q1.push(tmp);
			}
			T  ret = _q2.front();
			_q2.pop();
			return ret;
		}
		
	}
private:
	queue<T> _q1;
	queue<T> _q2;
};
void test()
{
	Stack<int> s;
	s.Push(1);
	s.Push(4);
	s.Push(5);
	s.Push(6);
	s.Push(7);
	cout << s.Pop() << endl;
	cout << s.Pop() << endl;
	cout << s.Pop() << endl;
	cout << s.Pop() << endl;
	cout << s.Pop() << endl;
}
int main()
{
	test();
	system("pause");
	return 0;
}


通过上边的代码,我们可以看出,这段代码的实现方法是图片里的方法2,即就是,每次push进不空的队列,pop时

将空队列当做辅助队来实现,这样的方法较图片中给出的方法1更有效一些。

上边程序的输出结果 7 6 5 4 1(两个 数字之间回车隔开),这样实现了先进后出。

对于图片中的方法1,这里就不给出代码了,有兴趣可以自己实现。~~~

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读