两个栈实现一个队。

思路:

入队:

只将栈s1作为入队。

出队:

将栈s2作为出队,如果栈s1不为空,s2为空,出队时将s1的元素倒入s2中,再pop();

否则s2不为空,出队时直接在栈s2中pop();

#include<iostream>
#include<stack>
#include<assert.h>
using namespace std;
template<class T>
class	Queue
{
public:
	Queue()
		:_size(0)
	{}
	void appendTail(T num)
	{
		s1.push(num);
		_size++;
	}
	void deleteHead()
	{
		assert(_size>0);
		if(s2.empty())
		{
			while(s1.size()!=1)
			{
				s2.push(s1.top());
				s1.pop();
			}
			s1.pop();
		}
		else
		{
			s2.pop();
		}
		_size--;
	}
	T& top()
	{
		assert(_size>0);
		if(s2.empty())
		{
			while(s1.size()!=1)
			{
			   s2.push(s1.top());
			}
			return s1.top();
		}
		else
		{
			return s2.top();
		}
	}
private:
	stack<T> s1;
	stack<T> s2;
	int _size;
};
int main()
{
	Queue<int> q;
	q.appendTail(1);
	q.appendTail(2);
	q.appendTail(3);
	q.appendTail(4);
	q.deleteHead();
	q.deleteHead();
	q.deleteHead();
	q.deleteHead();
	q.appendTail(5);
	cout<<q.top()<<endl;
	system("pause");
	return 0;
}
时间: 2024-11-05 05:01:15

两个栈实现一个队。的相关文章

两个栈实现一个队列

问题描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解法分析: 首先题目要求用两个栈实现一个队列,那么就要先分析为什么这么做.队列的特点就像排队的"先到先得"一样,即先入队的就先出队:而栈则正好相反,特点是"后进先出",那么问题来了怎么用"后进先出"的得到"先进先出"? 传说中最简单通用但效率不高的方法(其实我还真没想到这么做)是,入队的时候用stack1来存储,当出队的时候,先把

web前端面试系列 - 数据结构(两个栈模拟一个队列)

一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将剩余数据弹出s2,并压人s1. 思路二: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时,判断s1, 是否为空,如果不为空,则将数据直接压入s1, 如果为空,则将s2中的数据全部倒入s1,在将数据压人s1. 3. 出队时,判断s2, 是否为空,如果不为空,则直接弹出s2

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

1.两个栈实现一个队列 有三种思路: 思路一:将stack1作为存储空间,将stack2作为临时缓冲区,入队时,直接压入stac1,出队时,将stack1中的元素依次出栈压入stack2中,再将stack2的栈顶元素弹出,最后将stack2中的元素再倒回给stack1 思路二:入队时,判断stack1是否为空,如果stack1为空,则将stack2中的所有元素都倒入stack1中,再将元素直接压入stack1,否则,直接压入stack1中 出队时,判断stack2是否为空,如果stack2为空,

两个栈实现一个队列和两个队列实现一个栈【算法导论课后题】

关于两个栈实现一个队列和两个队列实现一个栈问题,网上有很多资料.这里只描述自己认为操作最少的方法. 两个栈实现一个队列 思想:假设两个栈分别为s1,s2.对s1进行入队,出队时,先判断s2是否为空,如果是则将s1中元素压入s2并弹出最上面元素,如果不是,则直接弹出s2最上面的元素. <span style="font-size:18px;">EnQueue(s1,s2,k){ push(s1,k)</span><span style="font-

[算法学习]两个栈实现一个队列

问题描述: 用两个栈实现一个队列,实现两个方法:入队appendTail,出队deleteHead 分析: 第一眼就能想到两个做法, (1) 入队麻烦出队容易: 声明两个栈,一个是存数据用的栈(dataStack),一个是辅助用的栈(tempStack). 入队操作时,先将dataStack中的所有元素出栈压入tempStack中,然后将要入队的元素压入tempStack中,再将tempStack所有元素出栈到dataStack,至此入队成功,dataStack栈顶元素就是第一个入队的元素(队头

两个栈模拟一个队列和两个队列模拟一个栈

此为网易的一道笔试题.到时候秀逗,不知所云.后来研究之后记录下,以备以后经常翻阅. 栈:先进后出 push和pop 队列:先进先出 offer和poll (1)两个栈模拟一个队列 即将先进后出实现先进先出.比较容易理解,只要所有数据先往一个栈里push,然后将该栈中的数据依次pop出来再push进第二个队列,则顺序自然颠倒过来了,则每次pop是从第二个队列中取数据. import java.util.*; public class StackQueue{ private Stack<Intege

用两个栈实现一个队列 &amp; 用两个队列实现一个栈

队列(先进先出)和栈(先进后出)都是常用的经常讨论的基本的数据结构,本文要讨论的是一对有趣的问题:如何用两个栈(队列)实现一个队列(栈),下面将分别说明,并附示例代码. 1.用两个栈实现一个队列 基本思路:初始有两个空栈s1和s2,当入队列是,将元素加入s1,而出队列则从s2出,当然s1与s2之间存在一定的交互. 入队:元素压入栈s1即可. 出队:首先看s2是否为空,若s2为空,则依次弹出s1的元素,加入s2中:若不为空,则不需额外处理: 之后弹出s2中的栈顶元素(即为队列的首元素)删除即可.

用两个栈实现一个队列——7

用两个栈实现一个队列,并实现两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 栈的特点是"先进后出,后进先出",而队列的特点是"先进先出,后进后出",因此可以想到只用一个栈是无法完成的,所以会需要两个栈,先将输入的数据都依次放入一个栈stack1中,但是先进去的数据会被压在栈底,而栈底的数据是需要最先被取出的,可画图如下: 当要完成在队列头部删除结点这就要用到另外一个栈stack2了,可以将第一个栈stack

【c++】使用两个栈实现一个队列(详细介绍)

使用两个栈实现一个队列 思路一: 我们设定s1是入栈的,s2是出栈的. 入队列,直接压到s1即可 出队列,先把s1中的元素倒入到s2中,弹出s2中的栈顶元素:再把s2的剩余元素全部倒回s1中. 缺点: 每次只要出栈一个元素就要将元素倒来倒去,麻烦!!! 思路2: 入队列时:如果s1为空,把s2中所有的元素倒出压到s1中.否则直接压入s1 出队列时:如果s2不为空,把s2中的栈顶元素直接弹出.否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素 思路1无条件地每次都要将元素倒来倒去,思路