7 两个栈模拟队列,两个队列模拟栈

利用两个栈模拟队列

stack1,stack2

首先向stack1当中放入数据,如果需要输出数据,从stack2中delete数据,如果stack2为空,就把stack1中数据导入stack2

<span style="font-size:14px;">#include "static.h"
#include <iostream>
#include <stack>

template<typename T>
class CQuue
{
public:
	CQuue(){};
	~CQuue(){};
	void appendTail(const T &node);
	T deleteHead();
private:
	stack<T> m_stack1;
	stack<T> m_stack2; //<存入数据的时候放入到stack1当中,取数据从stack2中取出,如果stack2为空,将stack1中数据转入stack2当中
};
template<typename T>
void CQuue<T>::appendTail(const T &node)
{
	m_stack1.push(node);
}

template<typename T>
T CQuue<T>::deleteHead()
{
	if (m_stack2.empty())
	{
		if (m_stack1.empty())
		{
			printf("There is no data in stack");
			exit(1);
		}
		while(!m_stack1.empty())
		{
			m_stack2.push(m_stack1.top());
			m_stack1.pop();
		}
	}
	T valueTemp = m_stack2.top();
	m_stack2.pop();
	printf("%d ",valueTemp);
	return valueTemp;
}
int main()
{
	CQuue<int> cqueue;
	cqueue.appendTail(1);
	cqueue.appendTail(3);
	cqueue.deleteHead();
	cqueue.appendTail(5);
	cqueue.appendTail(7);
	cqueue.deleteHead();
	cqueue.deleteHead();
	cqueue.deleteHead();
	return 0;
}</span>

两个队列模拟栈

这里用的方法和书中提到的方法不太一样,但是大致意思都是相同的,但是书中的方法会减少判断语句

两个队列,每次放入数据将数据放入一个空的队列当中,同时将另一个队列中的数据copy到当前这个队列当中,又保持一个空队列

输出数据的时候就从非空队列中输出

但是这样的方法每输入一个数据就需要copy一次,也比较麻烦

在书中,是每一次输出数据的时候需要将前面的数据copy到另一个queue当中

<span style="font-size:14px;">#include "static.h"
#include <iostream>
#include <queue>

template<typename T>
class CStack
{
public:
	CStack(){};
	~CStack(){};
	void appendTail(const T& node);
	T deleteHead();
private:
	queue<T> m_queue1;
	queue<T> m_queue2; //<存入数据的时候放入到m_queue1当中,然后再将数据都导入进queue2当中,然后每次添加数据放入一个空的queue当中
};
template<typename T>
void CStack<T>::appendTail(const T& node)
{
	if (m_queue1.size()== 0)
	{
		m_queue1.push(node);
		while (!m_queue2.empty())
		{
			m_queue1.push(m_queue2.front());
			m_queue2.pop();
		}
	}
	else
	{
		m_queue2.push(node);
		while (!m_queue1.empty())
		{
			m_queue2.push(m_queue1.front());
			m_queue1.pop();
		}
	}
}
template<typename T>
T CStack<T>::deleteHead()
{
	T tempValue;
	if (m_queue1.empty() && m_queue2.empty())
	{
		printf("the stack is empty");
		exit(1);
	}
	if (m_queue1.size()>0)
	{
		tempValue = m_queue1.front();
		m_queue1.pop();
	}
	else
	{
		tempValue = m_queue2.front();
		m_queue2.pop();
	}
	printf("%d ",tempValue);
	return tempValue;
}
int main()
{
	CStack<int> cstack;
	cstack.appendTail(1);
	cstack.deleteHead();
	cstack.appendTail(3);
	cstack.appendTail(5);
	cstack.appendTail(7);
	cstack.deleteHead();
	cstack.deleteHead();
	cstack.deleteHead();
	return 0;
}</span>
时间: 2024-12-28 00:42:08

7 两个栈模拟队列,两个队列模拟栈的相关文章

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型

import java.util.Stack; /**  * 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.  * @author user  *  *思路:队列是先入先出,栈是先入后出,可以将数据压入第一个栈后,在弹出来压入第二个栈,弹得时候直接从第二个栈弹出,弹出后又将  *第二个栈中的所有数据弹出重新压入的一个栈  */ public class Solution {     Stack<Integer> stack1 = new Stack<

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

两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后全部出stack1并进入stack2.实现队列的先进先出即:若stack2非空,我们需要的恰好再栈顶,出栈;若要给队列添加元素,即先进sack1,要出队时,若stack2不为空就出栈,为空时就把stack1全部进栈到stack2 二.两个队列实现一个栈 ps:图片原创于剑桥offer,来自网络 两个栈实现队列+两个队列实现栈----java,布布扣,bubuko.com

剑指offer (7) 两个栈实现队列 两个队列实现栈

题目:用两个栈实现一个队列. 队列的声明如下,请实现它的两个函数 appendTail 和  deleteHead,分别完成队列尾部插入结点 和 队列头部删除结点 AppendTail:直接将元素入栈stack1 DeleteHead:当stack2中不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出 如果stack2为空,我们把stack1中的元素逐个弹出并入栈stack2,由于先进入队列的元素被压到stack1的底端,经过弹栈和压入stack2之后就处于stack2的顶端 1

面试题9-用两个栈来实现一个队列,完成队列的Push和Pop操作

题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 一个栈压入元素,而另一个栈作为缓冲,将栈1的元素出栈后压入栈2中 代码 import java.util.Stack; /** *两个栈实现一个队列 * @author MSI */ public class Requeue{ Stack<Integer> sk1=new Stack<Integer>(); Stack<Integer> sk2=new Stack<

02两栈共享空间_DoubleStack--(栈与队列)

#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存储空间初始分配量 */ typedef int Status;

创建两个线程模拟火车站两个窗口售票程序

题目:创建两个线程模拟火车站两个窗口售票程序,窗口售票时间为1秒,两个窗口不能同时售票 #include<Windows.h> #include<iostream> using namespace std; //这是2个线程模拟买火车票的小程序 DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread data DWORD WINAPI Fun2Proc(LPVOID lpParameter);//thread data int inde

利用辅助栈解题的两个问题

题目一:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push,pop的时间复杂度都是O(1). 分析:建立一个辅助栈,每次将最小元素都保存起来放到辅助栈中.代码如下:其中m_data是数据栈,m_min是辅助栈. template <typename T>void StackWithMin<T>::push(const T& value) {     m_data.push(value);     if(m_min.size

说明如何用一个数组A[1...n]来实现两个栈,使得两个栈中的元素总数不到n时,两者都不会发生上溢。注意PUSH和POP操作的时间应为O(1)。

校招开始了,发现自己数据结构,Algorithms的知识都还给老师了.喵了个呜的! <算法导论>开啃吧~ 从第三章数据结构开始吧~ 10.1-2 : 如何用一个数组A[1...n]来实现两个栈,使得两个栈中的元素总数不到n时,两者都不会发生上溢.注意PUSH和POP操作的时间应为O(1). 解:思想是,建一维数组,两个栈stack1和stack2分别从数组A[0]和A[N-1]开始push,栈指针相遇时,两个栈中元素总数为n. 在思考怎么用java 实现,晚些时候 上代码吧~

算法(第四版)C#题解&mdash;&mdash;1.3.49 用 6 个栈实现一个 O(1) 队列

因为这个解法有点复杂,因此单独开一贴介绍. <算法(第四版)>中的题目是这样的: 1.3.49 栈与队列.用有限个栈实现一个队列,保证每个队列操作(在最坏情况下)都只需要常数次的栈操作. 那么这里就使用六个栈来解决这个问题. 这个算法来自于这篇论文. 原文里用的是 Pure Lisp,不过语法很简单,还是很容易看懂的. 先导知识--用两个栈模拟一个队列 如何使用两个栈来模拟一个队列操作? 这是一道很经典的题目,答案也有很多种,这里只介绍之后会用到的一种方法. 首先我们有两个栈,H 和 T,分别

《面试题精选》16.双栈实现队列和双队列实现栈

题目:分别用两个栈实现一个队列,和两个队列实现一个栈 分析: 1> 两个栈实现一个队列: 首先我们还是老方法,举个少量数据的例子,从中发现规律.首先我们向其中一个栈中插入a,b,c.存入栈中的顺序就是c-b-a,此时我们如果进行dequeue操作的话,因为队列是先进先出,所以a是先出的,但如果我们直接对栈pop的话那么出来的就是c.所以我们要将栈1中的数据转移到栈2中,直到最后一个元素时则把它出栈.这样我们就完成了dequeue操作. 但是queue操作怎么办?比如我们要让e,f入队,还是跟前面