用两个队列实现一个栈

前面说了用两个栈实现一个队列的算法,现在在写一个反过来的算法:

1.算法描述:

栈的特点就是先进后出,而队列的特点就是先进先出,基于两者的特点,有了此算法:

先看一张图:都喜欢图,图也能直接表达题的意思和本人的意思:

图中已经说的很清楚了,多余的方法暂且不说,按以上的图和思路,我给出以下代码:供自己参考:

/*
*设有两个队列A和B,栈的push操作,直接push到A的队尾就行了。
*栈的pop操作时,将A中的队列依次取出放到B中,取到最后一个时,
*最后一个不要放到B中,直接删掉,再将B中的值依次放回A中。
*栈的top操作时,将A中的队列依次取出放到B中,取到最后一个时,
*将最后一个值记录下来,再将最后一个值放到B中,再将B中的值依次放回到A中
*/

#include<iostream>
#include <queue>
using namespace std; 

template<class T>
class Mystack
{
public:
	Mystack()
	{}
	~Mystack()
	{}
public:
	void Push(T value);
	T Top();
	T Pop();
private:
	queue<T> Queue1;
	queue<T> Queue2;
};

//入栈
template<class T>
void Mystack<T>::Push(T a)
{
	Queue1.push(a);
}

//栈顶
template<class T>
T Mystack<T>::Top()
{
	return Queue1.back();//???????????这里是否可以
}

//出栈
template<class T>
T Mystack<T>::Pop()
{
	int node = 0;
	while(Queue1.back() != Queue1.front())
	{
		int num = Queue1.front();
		Queue2.push(num);
		Queue1.pop();
	}
	node = Queue1.back();
	Queue1.pop();

	while(!Queue2.empty())
	{
		int num = Queue2.front();
		Queue1.push(num);
		Queue2.pop();
	}
	return node;
}
void Test()
{
	Mystack<int> s1;
	s1.Push(1);
	s1.Push(2);
	s1.Push(3);
	s1.Push(4);
	s1.Push(5);
    cout<<s1.Top()<<endl;
	for(int i = 0; i < 5; i++)
	{
		cout<<s1.Pop()<<"->";
	}
	cout<<"NULL"<<endl;
}

int main()
{
	Test();
	return 0;
}
时间: 2024-10-18 18:58:13

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

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-

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

此为网易的一道笔试题.到时候秀逗,不知所云.后来研究之后记录下,以备以后经常翻阅. 栈:先进后出 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中的栈顶元素(即为队列的首元素)删除即可.

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

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

两个栈实现一个队列以及两个队列实现一个栈(Java)

两个栈实现一个队列 import java.util.Stack; public class Demo07 { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); public void push(int node) { stack1.push(node); } public int pop() { if(stack2.size

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

题目:用两个队列实现一个栈 算法思路: 现有两个队列q1与q2,入栈:如果q1与q2都为空,那么我们选择q1入栈也就是入队列,比如q1入栈 1 2 3 4 :现在要出栈,后进先出那么4要出栈.但是q1是一个 队列,先进先出,那么 1 2 3出队列 q2 1 2 3 入队列,q1中此时剩余4,把4出对列达到出栈的效果.  这个时候如果我们又加入一个元素5,那么我们应该把5放到 q1还是q2,因为现在q2中有 1 2 3,把5放到q1不方便统计,所以要把5放入到q2:如果5放到了q1,等下编写出栈的

使用两个队列模拟一个栈

准备笔试,在看相关知识,看到这个问题,如何使用两个队列模拟一个栈,在参考了相关知识下,实现了代码如下: 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