程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 用兩個隊列實現棧

用兩個隊列實現棧

編輯:C++入門知識

使用兩個隊列實現一個棧

這個棧的聲明如下:

template<typename T>
class Stack_by_queue
{
    public:
        Stack_by_queue(){};
        ~Stack_by_queue(){};
        void append_tail(const T& node);
        T delete_head();
        void Show_Stack(void);//從棧頂依次向棧低顯示輸出數據
    protected:
    private:
        queue<T> queue1;
        queue<T> queue2;
};

分析:棧的特性是先進後出,舉一個序列1,2,3,4來說,我們試著往一個queue1裡面push進去,這時候queue1的隊頭是1,隊尾是4,這時候要實現delete_head的話,對應的棧應該刪除4,對於queue1的隊尾,前面的1,2,3,都是不需要的。
實現dalete_head解決方法就是,依次彈出1,2,3並且壓入queue2中,queue1裡面只保存4,這時候要delete_head的話,對queue1進行pop操作就行了,然後queue1為空(注意這個狀態),然後我要繼續delete_head,這個時候也是按照上面的思路,將queue2的1,2依次彈出,壓入queue1裡面,知道剩下最後一個隊尾元素3,將它pop掉就行了!這時候的狀態是queue1不為空,queue2為空。
實現append_tail的話也容易。注意上面的刪除頭以後的兩種狀態其實可以可以歸結為一種,那就是其中一個queue為空,另一個可以為空(這個時候模擬的stack就是空),或者不為空,append_tail來說,只需往非空的queue裡面添到隊尾就行了,若是都為空,隨便選一個即可

 

#include <queue>   
#include <iostream>   
using namespace std;  
template<typename T>  
class Stack_by_queue  
{  
    public:  
        Stack_by_queue(){};  
        ~Stack_by_queue(){};  
        void append_tail(const T& node);  
        T delete_head();  
        void Show_Stack(void);  
    protected:  
    private:  
        queue<T> queue1;  
        queue<T> queue2;  
};  
template<typename T>  
void Stack_by_queue<T>::Show_Stack(void)  
{  
    queue<T> Q1(queue1);  
    queue<T> Q2(queue2);  
    T tmp;  
    cout<<"\n this is Show_Stack!從棧頂到棧底顯示數據\n";  
    while(!Q1.empty() || !Q2.empty())  
    {  
           if(Q1.empty() && !Q2.empty())  
        {  
            //2->1   
            if (Q2.size() < 1)  
            {  
                return ;  
            }  
            while(Q2.size() != 1)  
            {  
                tmp = Q2.front();  
                Q2.pop();  
                Q1.push(tmp);  
            }  
            cout<<Q2.front()<<"  ";  
            Q2.pop();  
        }  
        if(!Q1.empty() && Q2.empty())  
        {  
            //1->2   
            if (Q1.size() < 1)  
            {  
                return ;  
            }  
            while(Q1.size() != 1)  
            {  
                tmp = Q1.front();  
                Q1.pop();  
                Q2.push(tmp);  
            }  
            cout<<Q1.front()<<"  ";  
            Q1.pop();  
  
        }  
    }  
  
}  
//保證在所有的過程中,至少隊列有一個是空的   
template<typename T>  
T Stack_by_queue<T>::delete_head()  
{  
    T tmp;  
    if(queue1.empty() && !queue2.empty())  
    {  
        //2->1   
        if (queue2.size() < 1)  
        {  
        return -1;  
        }  
        while(queue2.size() != 1)  
        {  
            tmp = queue2.front();  
            queue2.pop();  
            queue1.push(tmp);  
        }  
        tmp = queue2.front();  
        queue2.pop();  
        return tmp;  
    }  
    if (!queue1.empty() && queue2.empty())  
    {  
        //1->2   
        T tmp;  
        if (queue1.size() < 1)  
        {  
            return -1;  
        }  
        while(queue1.size() != 1)  
        {  
            tmp = queue1.front();  
            queue1.pop();  
            queue2.push(tmp);  
        }  
        tmp = queue1.front();  
        queue1.pop();  
        return tmp;  
    }  
    else  
        return -1;  
}  
template<typename T>  
void Stack_by_queue<T>::append_tail( const T& node )  
{  
    //保證有一隊列為空,若全為空,則隊空,任選一個隊列就行   
    if (queue1.empty() && !queue2.empty())  
        queue2.push(node);  
    if (!queue1.empty() && queue2.empty())  
        queue1.push(node);  
    if (queue1.empty() && queue2.empty())  
        queue1.push(node);  
    else  
        return;  
}  
int main()  
{  
    Stack_by_queue<char> my_stack;  
    my_stack.append_tail('a');  
    my_stack.append_tail('b');  
    my_stack.append_tail('c');  
    my_stack.Show_Stack();  
  
  
    my_stack.delete_head();  
    my_stack.delete_head();  
    my_stack.Show_Stack();  
  
    my_stack.append_tail('d');  
    my_stack.append_tail('e');  
    my_stack.Show_Stack();  
  
    my_stack.delete_head();  
    my_stack.Show_Stack();  
  
    my_stack.append_tail('f');  
    my_stack.Show_Stack();  
}  
/************************** 
運行結果: 
 
 this is Show_Stack!從棧頂到棧底顯示數據 
c  b  a 
 this is Show_Stack!從棧頂到棧底顯示數據 
a 
 this is Show_Stack!從棧頂到棧底顯示數據 
e  d  a 
 this is Show_Stack!從棧頂到棧底顯示數據 
d  a 
 this is Show_Stack!從棧頂到棧底顯示數據 
f  d  a 
 
 
***************************/  

#include <queue>
#include <iostream>
using namespace std;
template<typename T>
class Stack_by_queue
{
    public:
        Stack_by_queue(){};
        ~Stack_by_queue(){};
        void append_tail(const T& node);
        T delete_head();
        void Show_Stack(void);
    protected:
    private:
        queue<T> queue1;
        queue<T> queue2;
};
template<typename T>
void Stack_by_queue<T>::Show_Stack(void)
{
    queue<T> Q1(queue1);
    queue<T> Q2(queue2);
    T tmp;
    cout<<"\n this is Show_Stack!從棧頂到棧底顯示數據\n";
    while(!Q1.empty() || !Q2.empty())
    {
           if(Q1.empty() && !Q2.empty())
        {
            //2->1
            if (Q2.size() < 1)
            {
                return ;
            }
            while(Q2.size() != 1)
            {
                tmp = Q2.front();
                Q2.pop();
                Q1.push(tmp);
            }
            cout<<Q2.front()<<"  ";
            Q2.pop();
        }
        if(!Q1.empty() && Q2.empty())
        {
            //1->2
            if (Q1.size() < 1)
            {
                return ;
            }
            while(Q1.size() != 1)
            {
                tmp = Q1.front();
                Q1.pop();
                Q2.push(tmp);
            }
            cout<<Q1.front()<<"  ";
            Q1.pop();

        }
    }

}
//保證在所有的過程中,至少隊列有一個是空的
template<typename T>
T Stack_by_queue<T>::delete_head()
{
    T tmp;
    if(queue1.empty() && !queue2.empty())
    {
        //2->1
        if (queue2.size() < 1)
        {
        return -1;
        }
        while(queue2.size() != 1)
        {
            tmp = queue2.front();
            queue2.pop();
            queue1.push(tmp);
        }
        tmp = queue2.front();
        queue2.pop();
        return tmp;
    }
    if (!queue1.empty() && queue2.empty())
    {
        //1->2
        T tmp;
        if (queue1.size() < 1)
        {
            return -1;
        }
        while(queue1.size() != 1)
        {
            tmp = queue1.front();
            queue1.pop();
            queue2.push(tmp);
        }
        tmp = queue1.front();
        queue1.pop();
        return tmp;
    }
    else
        return -1;
}
template<typename T>
void Stack_by_queue<T>::append_tail( const T& node )
{
    //保證有一隊列為空,若全為空,則隊空,任選一個隊列就行
    if (queue1.empty() && !queue2.empty())
        queue2.push(node);
    if (!queue1.empty() && queue2.empty())
        queue1.push(node);
    if (queue1.empty() && queue2.empty())
        queue1.push(node);
    else
        return;
}
int main()
{
    Stack_by_queue<char> my_stack;
    my_stack.append_tail('a');
    my_stack.append_tail('b');
    my_stack.append_tail('c');
    my_stack.Show_Stack();


    my_stack.delete_head();
    my_stack.delete_head();
    my_stack.Show_Stack();

    my_stack.append_tail('d');
    my_stack.append_tail('e');
    my_stack.Show_Stack();

    my_stack.delete_head();
    my_stack.Show_Stack();

    my_stack.append_tail('f');
    my_stack.Show_Stack();
}
/**************************
運行結果:

 this is Show_Stack!從棧頂到棧底顯示數據
c  b  a
 this is Show_Stack!從棧頂到棧底顯示數據
a
 this is Show_Stack!從棧頂到棧底顯示數據
e  d  a
 this is Show_Stack!從棧頂到棧底顯示數據
d  a
 this is Show_Stack!從棧頂到棧底顯示數據
f  d  a


***************************/


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved