两个队列模拟一个栈

#include <iostream>
#include <assert.h>
#include <queue>
using namespace std;
/*两个队列模拟一个堆栈*/
/*队列A、B
入栈:将元素依次压入到非空的队列,第一个元素压倒对列A
出栈:把队列A的前n-1个元素倒到队列B,把第n个元素去掉。此时数据在B中,下次操作,则对B操作。
栈顶:把队列A的前n-1个元素倒到队列B,把第n个元素作为栈顶*/
template <typename T>
class MyStack
{
public:
    //入栈,第一个元素进到队列deque1,以后每个元素进到非空的队列
    void  push(const T &element) ; 

    //出栈,将非空队列的前n-1个元素转移到另一个空的队列,删除非空队列的第n个元素
    void pop() ; 

    //栈顶元素,将非空队列的前n-1个元素转移到另一个空的队列,将非空队列的第n个元素返回
    T top();  

    //栈是否为空
    bool empty()
    {
        return (q1.empty()&&q2.empty());
    }
private:
    queue<T> q1;
    queue<T> q2;
};  

template<typename T> void MyStack<T>::push(const T &element)
{
	if (q1.empty() && q2.empty())
	{
		q1.push(element);
	}
	else if (!q1.empty() && q2.empty())
	{
		q1.push(element);
	}
	else if (q1.empty() && !q2.empty())
	{
		q2.push(element);
	}
}
template<typename T>void MyStack<T>::pop()
{
	if (!q1.empty())
	{
		int size = q1.size();
		for (int i=0; i<size-1; i++)
		{
			q2.push(q1.front());
			q1.pop();
		}
		q1.pop();
	}
	else
	{
		int size = q2.size();
		for (int i=0; i<size-1; i++)
		{
			q1.push(q2.front());
			q2.pop();
		}
		q2.pop();
	}
}
template <typename T>T MyStack<T>::top()
{
	if (!q1.empty())
	{
		int size = q1.size();
		for (int i=0; i<size-1; i++)
		{
			q2.push(q1.front());
			q1.pop();
		}
		T temp = q1.front();
		q1.pop();
		q2.push(temp);
		return temp;
	}
	else
	{
		int size = q2.size();
		for (int i=0; i<size-1; i++)
		{
			q1.push(q2.front());
			q2.pop();
		}
		T temp = q2.front();
		q2.pop();
		q1.push(temp);
		return temp;
	}
}
int main(int argc, char *argv[])
{
    MyStack<int> my;
    for (int i=0; i<10; i++)
    {
        my.push(i);
    }
    while (!my.empty())
    {
        cout<<my.top()<<" ";
        my.pop();
    }
    cout<<endl;
	return 0;
}  

时间: 2024-10-26 17:56:47

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

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

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

使用两个队列模拟一个栈

准备笔试,在看相关知识,看到这个问题,如何使用两个队列模拟一个栈,在参考了相关知识下,实现了代码如下: 1 public class Stack<E>{ 2 Queue<E> q1 = null; //队列q1提供压栈功能, 3 Queue<E> q2 = null; //队列q2提供弹栈功能 4 5 public Stack(){ 6 q1 = new LinkedList<E>(); 7 q2 = new LinkedList<E>(); 8

数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈

今天我们需要学习的是关于数据结构里面经常看到的两种结构,栈和队列.可以说我们是一直都在使用栈,比如说在前面递归所使用的的系统的栈,以及在链表倒序输出时介绍的自定义栈类Stack和使用系统的栈进行递归.那么,在这里我们就讲述一下这两个比较具有特色的或者说关系比较紧密的数据结构之间的互相实现问题. 一:两个栈模拟实现一个队列: 栈的特点是先进后出,然而队列的特点是先进先出. public class Queen(Stack s1,Stack s2){ //实现插入的方法 public void ad

剑指offer:两个队列模拟一个栈

题目描述用两个队列来实现一个栈,完成栈的Push和Pop操作. 队列中的元素为int类型. 实现方式其实和两个栈模拟一个队列相似,但是区别在于这两个队列的作用和那两个栈的作用不一样. class Solution: """ 用两个队列模拟一个栈,如果两个队列的容量分别为M和N,其中M > N,那么模拟得到的栈的容量是N+1 因为假设先把queue1塞进N+2个,此时将元素出栈,则需要先将queue1的N+1个元素出队后压入queue2, 由于queue2的容量只有N,入

《剑指Offer》附加题_用两个队列实现一个栈_C++版

在<剑指Offer>中,在栈和队列习题中,作者留下来一道题目供读者自己实现,即"用两个队列实现一个栈". 在计算机数据结构中,栈的特点是后进先出,即最后被压入(push)栈的元素会第一个被弹出(pop);队列的特点是先进先出,即第一个进入队列的元素将会被第一个弹出来.虽然栈和队列特点是针锋相对,但是两者却相互联系,可以互相转换. 在"用两个队列实现一个栈"问题中,我们用两个队列的压入和弹出来模拟栈的压入和弹出.我们通过画图的手段把抽象的问题形象化. 在上

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

转自:http://bylijinnan.iteye.com/blog/1450125 ———————————————————————————————————————————— Java代码   import java.util.ArrayList; import java.util.List; import java.util.Stack; /* * Q 57 用两个栈实现队列 */ public class QueueImplementByTwoStacks { private Stack<

剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈

剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()-1份元素poll出来,添加到另为一个为空的队列中,再把队列中最后的元素poll出来两个队列在栈不为空的情况下始终是有一个为空,另一个不为空的.push添加元素到非空的队列中,pop把非空队列的元素转移到另一个空的队列中,直到剩下最后一个元素,这个元素就是要出栈的元素(最后添加到队列中的元素). 1

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

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-