zoukankan      html  css  js  c++  java
  • 用两个队列实现一个栈

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

    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;
    }

  • 相关阅读:
    《游牧者的抉择》读后感 读书笔记
    《白噪音》读后感 读书笔记
    《远大前程》读后感 读书笔记
    《D.H.劳伦斯传》读后感 读书笔记
    《活出心花怒放的人生》读后感 读书笔记
    《三千佛塔烟云下》读后感 读书笔记
    python之第三方模块安装
    python之实现循环查看指定路径下的所有文件---os.walk
    python之递归
    python之MD5加密
  • 原文地址:https://www.cnblogs.com/melons/p/5791848.html
Copyright © 2011-2022 走看看