码迷,mamicode.com
首页 > 其他好文 > 详细

两个栈实现一个队列

时间:2016-04-13 00:35:15      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:两个栈实现一个队列

                 利用栈的特性,实现队列

    1.栈-后进先出,队列-先进先出,使用两个栈,栈1作用为push数据用,栈2作为pop数据用。

    2.原理分析:

      1).push数据-当模拟实现的queue push数据往栈1中push。

      2).pop数据-判断栈2是否为空,如果栈2为空,则首先将栈1的数据压入到栈2中(依次取栈顶元素push到栈2中),然后pop栈2的栈顶元素。如果,栈2有元素,直接pop栈2的栈顶元素。

      3).打印元素

         a:栈1和栈2都没有元素--直接返回。

         b:栈1有元素且栈2没有元素--将栈1的元素push到栈2中,然后依次打印栈2的元素。

         c:栈1没有元素且栈2有元素--直接依次打印栈2的元素。

         d:栈1有元素且栈2有元素--首先依此打印栈2的元素(每打印一个元素就pop掉),然后将栈1的元素push到栈2中,然后依次打印栈2的元素。


    class Queue          //使用的是库中的栈
    {
    public:
    	void push(const int& x)
    	{
    		_st1.push(x);
    	}
    
    	void pop()
    	{
    		if (_st1.empty() && _st2.empty())   
    		{
    			cout << "empty queue!" << endl;
    			return;
    		}
    
    		if (!_st2.empty())
    		{
    			_st2.pop();
    		}
    		else
    		{
    			while (!_st1.empty())
    			{
    				_st2.push(_st1.top());
    				_st1.pop();
    			}
    			_st2.pop();
    		}
    		
    	}
    
    	void print()
    	{
    		stack<int> tmp1 = _st1;   //没有这两句会出bug
    		stack<int> tmp2 = _st2;
    
    		if (_st1.empty() && _st2.empty())    //栈1和栈2都没有元素
    		{
    			cout << "empty queue!" << endl;
    			return;
    		}
    		else if ((!_st1.empty()) && _st2.empty())   //栈1有元素且栈2没有元素
    		{
    			
    			while (!tmp1.empty())
    			{
    				tmp2.push(tmp1.top());
    				tmp1.pop();
    			}
    
    			while (!tmp2.empty())
    			{
    				cout << tmp2.top() << "->";
    				tmp2.pop();
    			}
    			cout << endl;
    
    		}
    		else if (_st1.empty() && (!_st2.empty()))     //栈1没有元素且栈2有元素
    		{
    			while (!tmp2.empty())
    			{
    				cout << tmp2.top() << endl;
    				tmp2.pop();
    			}
    		}
    		else if ((!tmp1.empty()) && (!tmp2.empty()))   //栈1有元素且栈2有元素
    		{
    			while (!tmp2.empty())
    			{
    				cout << tmp2.top() << endl;
    				tmp2.pop();
    			}
    
    			while (!tmp1.empty())
    			{
    				tmp2.push(tmp1.top());
    				tmp1.pop();
    			}
    
    			while (!tmp2.empty())
    			{
    				cout << tmp2.top() << endl;
    				tmp2.pop();
    			}
    		}
    	}
    private:
    	stack<int> _st1;  //栈1
    	stack<int> _st2;   //栈2
    };

    以上就是本人在学习过程中的一些经验总结。当然,本人能力有限,难免会有纰漏,希望大家可以指正。

本文出自 “做一个小小小司机” 博客,请务必保留此出处http://10799170.blog.51cto.com/10789170/1763146

两个栈实现一个队列

标签:两个栈实现一个队列

原文地址:http://10799170.blog.51cto.com/10789170/1763146

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!