013实现使用两个堆栈队列(keep it up)

实现使用两个堆栈队列

FIFO队列是一种数据结构(FIFO),后堆叠前进出的数据结构的(FILO)。

两个栈实现的最简单的方法就是排队:队列中的第一个推栈,

队列将数据顺序的第一个堆栈推入第二堆叠,然后叠加.

两个规则:

1)进队列,则直接压入第一个栈

2)出队列,若果第二个栈不为空。直接pop(),如过第二个栈为空,

则把第一个栈中的数据所有压入第二个栈(第一个栈此时为空)。

实际写代码时注意栈为空的情况。

代码:

#include <iostream>
#include <stack>

class Queue
{
public:
	Queue() {}
	~Queue() {}

	void push(int vData)
	{
		m_First.push(vData);
	}

	void pop()
	{
		if (m_Second.empty())
		{
			if (m_First.empty())
			{
				std::cout << "the queue is empty" << std::endl;
				return ;
			}
			move(m_First, m_Second);
			m_Second.pop();
		}
	}

	int top()
	{
		if (m_Second.empty())
		{
			if (m_First.empty())
			{
				std::cout << "the queue is empty" << std::endl;
				return ;
			}
			move(m_First, m_Second);
		}
		return m_Second.top();
	}

	int back()
	{
		if (m_First.empty())
		{
			if (m_Second.empty())
			{
				std::cout << "the queue is empty" << std::endl;
				return ;
			}
			move(m_Second, m_First);
		}
		return m_First.top();
	}

private:
	void move(std::stack<int>& vL, std::stack<int>& vR)
	{
		while (!vL.empty())
		{
			vR.push(vL.top());
			vL.pop();
		}
	}

private:
	std::stack<int> m_First;
	std::stack<int> m_Second;
};

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-02 03:54:59

013实现使用两个堆栈队列(keep it up)的相关文章

两个堆栈实现列队

如何用两个堆栈模拟实现一个队列? 如何用两个堆栈模拟实现一个队列?  如果这两个堆栈的容量分别是m和n(m>n),你的方法能保证的队列容量是多少? class Solution { //主要思路:建立两个栈S1,S2,当执行PUSH操作时将数据压到S1中:当执行POP操作时分两种情况: //1.如果S2不为空,则从S2中弹出一个数并输出:2.如果S2为空S1不为空则将S1中的数据全部导入S2中, //如果两个都为空则表示队列中没有数字,输出-1. public: void push(int no

包含MIN函数的栈+一个数组实现两个堆栈+两个数组实现MIN栈

1.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路:利用一个辅助栈来存放最小值 栈  3,4,2,5,1 辅助栈 3,2,1 每入栈一次,就与辅助栈顶比较大小,如果小就入栈,如果大就不入栈当前的辅助栈:当出栈时,辅助栈元素相等时也要出栈. class Solution { public: stack<int> mystack1;//辅助栈 stack<int> minstack;//最小栈 void push(int value) { if(

一个数组构造两个堆栈

***用一个数组表示两个堆栈,最大限度的利用空间 0 1 2 3 若果像右图中从中间分成两部分,则可能存在其中一个堆栈满了,而另一个堆栈还有空的,为你最大限度的利用空间,需要两边像中间长,知道指针碰头表示堆栈已满 #include<iostream>using namespace std;#define Maxsize 100class stack{public: int a[Maxsize]; int top1; int top2;};void push(stack&A, int x

4-7 在一个数组中实现两个堆栈

本题要求在一个数组中实现两个堆栈. 函数接口定义: Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ); ElementType Pop( Stack S, int Tag ); 其中Tag是堆栈编号,取1或2:MaxSize堆栈数组的规模:Stack结构定义如下: typedef int Position; struct SNode { ElementType *Data; Positio

hud-3530-Subsequence-维护两个单调队列

维护两个单调队列,一个存储当前点之前的最大值. 另外一个存储当前点之前的最小值. 若最大值与最小值之间的差大于k,那么就把最大值和最小值中位置靠前的往后移. #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<queue> using namespace std; //#define INF ((1<<30)-1) #

6-7 在一个数组中实现两个堆栈

6-7 在一个数组中实现两个堆栈(20 分) 本题要求在一个数组中实现两个堆栈. 函数接口定义: Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ); ElementType Pop( Stack S, int Tag ); 其中Tag是堆栈编号,取1或2:MaxSize堆栈数组的规模:Stack结构定义如下: typedef int Position; struct SNode { Ele

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

两个栈实现队列两个队列实现堆栈问题,网上有很多资料.这里仅仅是叙述操作方法的介绍觉得至少. 两个栈实现一个队列 思想:假设两个栈分别为s1,s2.对s1进行入队,出队时,先推断s2是否为空,假设是则将s1中元素压入s2并弹出最上面元素,假设不是,则直接弹出s2最上面的元素. <span style="font-size:18px;">EnQueue(s1,s2,k){ push(s1,k)</span><span style="font-fami

线性表 堆栈 队列 树和堆

线性表:是一个顺序存储的数据集合,它支持在表中任何位置进行插入和删除操作 堆栈:可以看做是一种特殊的线性表,它只允许在线性表的一端(栈顶)进行插入和删除操作 队列:表示一个排队等候的队伍,它允许在队伍的后端进行插入操作,队伍的前端进行删除操作 二叉树:是一种能够有效的进行数据的查找,排序,插入和删除等操作的数据结构. 堆:是一种可用于开发有效排序和优先队列的算法的数据结构 由于栈只允许在栈顶进行插入和删除操作,所以用数组线性表来实现栈比用链表来实现效率高. 由于删除是在线性表的开头进行,所以用链

两个堆栈共用一块新的存储空间溶液

就业数据结构前一段时间,有一个问题,与大家分享: 用顺序存储方式存储,现两栈共享空间V[1..m], top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是( ). A. |top[2]-top[1]|=0      B. top[1]+1=top[2] C. top[1]+top[2]=m      D. top[1]=top[2] 本来这是一个非常easy的问题,想必大家一眼就能得出答案是B,但我当时不知道是那根筋抽搐,自己跟自己较劲,牛角尖钻