两个队列实现一个栈

两个队列("先进先出")实现一个栈("后进先出")

//.h

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

template<class T>
class Stack
{
public:
    Stack()
		:_size(0)
	{}
    ~Stack()
	{}  
    void Push(T t);  
    void Pop();
	T Top();  
	int Size();

protected:
    queue<T> A;  
    queue<T> B; 
	int _size;
};  
 
template<class T>
void Stack<T>::Push(T t)
{  
    A.push(t); 
	++_size;
}

template<class T>
void Stack<T>::Pop() 
{   
    while(A.size()>1)  
    {  
        B.push(A.front());  
        A.pop();  
    }  
	A.pop();  
    while(B.size()!=0)  
    {  
        A.push(B.front());  
        B.pop();  
    }
	--_size;
}

template<class T>
T Stack<T>::Top()  
{  
    while(A.size()>1)  
    {  
        B.push(A.front());  
        A.pop();  
    }  
 
    T tmp=A.front();  
    B.push(A.front());
 
    A.pop();  

    while(B.size()!=0)  
    {  
        A.push(B.front());  
        B.pop();  
    }  
    return tmp;  
}

template<class T>
int Stack<T>::Size()
{
	return _size;
}

//.c

#include"StackQueue.h"
#include<iostream>
using namespace std;
#include<string>

void Test1()
{
	Stack<int> s;  
    s.Push(1);
	s.Push(2);
	s.Push(3);

    while(s.Size())
    {
        cout<<s.Top()<<" ";
        s.Pop();
    }  
	cout<<endl;
}

void Test2()
{
	Stack<string> s;  
	s.Push("ld");
	s.Push("wor");
	s.Push(" ");
	s.Push("llo");
	s.Push("he");

    while(s.Size())
    {  
        cout<<s.Top();
        s.Pop();
    }  
	cout<<endl;
}

int main()
{
	Test1();
//	Test2();

	return 0;
}
时间: 2024-12-18 19:24:56

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

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