用两个队列实现栈&用两个栈实现队列

原创 2016年08月30日 13:12:57

栈和队列的相互实现一直是面试中常考的问题。下面是它们的相互实现代码,以方便大家学习交流。

  • 用两个队列实现栈
/*两个队列实现栈*/
#include <iostream>
#include <queue>
using namespace std;

template<typename T>
class my_stack
{
	private:
		queue<T> q_one;
		queue<T> q_two;
	public:
		int top()
		{
			if(!q_one.empty()) return q_one.back();
			else if(!q_two.empty()) return q_two.back();
		}
		int size()
		{
			return max(q_one.size(),q_two.size());
		}
		void push(T data)
		{
			if(!q_one.empty())  q_one.push(data);
			else  q_two.push(data);
		}
		void pop()
		{
			int res=0;
			if(!q_one.empty())
			{
				while(q_one.size()>1)
				{
					q_two.push(q_one.front());
					q_one.pop();
				}
				res=q_one.front();
				q_one.pop();
			}
			else if (!q_two.empty())
			{
				while(q_two.size()>1)
				{
					q_one.push(q_two.front());
					q_two.pop();
				}
				res=q_two.front();
				q_two.pop();
			}
		}
};

int main()
{
	my_stack<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	cout<<q.top()<<endl;
	q.pop();
	cout<<q.top()<<endl;
	q.push(4);
	cout<<q.top()<<endl;
	q.pop();
	q.pop();
	cout<<q.top()<<endl;
}


  • 用两个栈实现队列
/*两个栈实现队列*/
#include <iostream>
#include <stack>
using namespace std;
template<typename T>
class my_queue
{
	private:
		stack<T> s_push;
		stack<T> s_pop;
	public:
		void push(T data)
		{
			while(!s_pop.empty())
			{
				s_push.push(s_pop.top());
				s_pop.pop();
			}
			s_push.push(data);
		}
		void pop()
		{
			while(!s_push.empty())
			{
				s_pop.push(s_push.top());
				s_push.pop();
			}
			if(!s_pop.empty())	s_pop.pop();
		}
		int size()
		{
			return max(s_push.size(),s_pop.size());
		}
		T front()
		{
			while(!s_push.empty())
			{
				s_pop.push(s_push.top());
				s_push.pop();
			}
			if(!s_pop.empty())	return s_pop.top();
		}
		T back()
		{
			while(!s_pop.empty())
			{
				s_push.push(s_pop.top());
				s_pop.pop();
			}
			return s_push.top();
		}	
};

int main()
{
	my_queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	cout<<q.front()<<endl<<q.back()<<endl;
	q.pop();
	cout<<q.front()<<endl<<q.back()<<endl;
	q.push(4);
	q.pop();
	q.pop();
	cout<<q.front()<<endl<<q.back()<<endl;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Python :用两个栈实现队列

牛客网上的剑指 offer的在线编程: 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 # -*- coding:utf-8 -*- class...
  • Lynette_bb
  • Lynette_bb
  • 2017年07月13日 21:17
  • 723

两个栈实现队列+两个队列实现栈----java

两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后全部出stack1并进入stack2.实现队列的先进先出即:若stack2非空,我们需要的恰好...
  • u010093630
  • u010093630
  • 2014年08月08日 00:52
  • 10042

C++算法之 两个队列实现一个栈

题目:用两个队列实现一个栈 算法思路: 现有两个队列q1与q2,入栈:如果q1与q2都为空,那么我们选择q1入栈也就是入队列,比如q1入栈 1 2 3 4 ;现在要出栈,后进先出那么4要出栈。但是...
  • djb100316878
  • djb100316878
  • 2014年12月09日 10:48
  • 9880

两个栈实现一个队列,两个队列实现一个栈

问题1:用两个栈实现一个队列,实现队列的push和delete操作 栈的特性是先进后出(FILO),队列的特性是先进先出(FIFO),在实现delete时,我们的难点是如何将栈中最底层的数据拿出来,...
  • zw_1510
  • zw_1510
  • 2016年07月17日 00:32
  • 4081

【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)

使用两个栈实现一个队列思路一:我们设定s1是入栈的,s2是出栈的。入队列,直接压到s1即可出队列,先把s1中的元素倒入到s2中,弹出s2中的栈顶元素;再把s2的剩余元素全部倒回s1中。650) thi...
  • hanjing_1995
  • hanjing_1995
  • 2016年05月30日 17:18
  • 1159

用两个队列模拟一个栈

用两种方法实现了用两个队列模拟一个栈的操作。一种的入栈时间复杂度为O(1),出栈O(n),一种入栈O(n),出栈O(1)。 并且附有源代码方便今后阅读和与大家交流。...
  • yin1203014
  • yin1203014
  • 2015年07月25日 23:23
  • 1527

C++两个栈实现一个队列和两个队列实现一个栈

今天用C++实现了下两个栈模拟一个队列和两个队列模拟一个栈!代码可能有很多漏洞,如果读者发现问题, 可以及时反馈,非常感谢!!!         代码如下: #include #include...
  • qianghaohao
  • qianghaohao
  • 2016年05月04日 22:11
  • 883

剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。 我们通过一个具体的例子来分析该队列插...
  • jsqfengbao
  • jsqfengbao
  • 2015年07月27日 19:25
  • 2527

剑指offer《面试题7:用两个栈实现队列》及用两个队列实现一个栈

栈和队列是两个特点相反的数据结构,但联系非常密切。 栈的特点就是“后进先去”,即是最后被压入(push)的栈元素会被第一个弹出(pop)。 队列的特点就是“先进先出”,即是第一个进...
  • SingleLegCat
  • SingleLegCat
  • 2015年07月15日 00:40
  • 1374

【C++面试题】利用两个栈实现1个队列

1、题目   利用两个栈实现一个队列    2、要求   只能使用栈的pop(),top()和push(),以及测试栈是否为空empty()四个操作. 来实现队列的empty(), ...
  • liulongling
  • liulongling
  • 2016年02月19日 11:03
  • 1921
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用两个队列实现栈&用两个栈实现队列
举报原因:
原因补充:

(最多只允许输入30个字)