用两个栈实现队列

用两个栈实现队列。队列声明如下,请实现它的两个函数append_tail和delete_head在队列的队尾添加数据和删除队头 

class Queue_by_stack
{
    public:
        Queue_by_stack(){};
        ~Queue_by_stack(){};
        void append_tail(const T& node);
        T delete_head();
        void Show_Queue(void); //从队首到队尾依次输出队列数据
    protected:
    private:
        stack<T> stack1;
        stack<T> stack2;
};

分析:队列的特性是先进后出,比如对于1,2,3,4序列来说,首先将序列压入栈(stack1和stack2随便选一个),要实现delete_head的话,不能对stack1进行pop,因为这时stack1的top值是4,我们要删除的是1,注意这时候stack2还没有利用,如果我将stack1里的数据都逐个pop,push进去stack2,对于stack2;来说,那不就正好相当于原序列吗?实现delete_head的话只需对stack2进行pop就行了,append_tail的话只需往空的stack1里面push就行了。代码实现如下 

 

#include <stack>
#include <iostream>
using namespace std;
template<typename T>
class Queue_by_stack
{
    public:
        Queue_by_stack(){};
        ~Queue_by_stack(){};
        void append_tail(const T& node);
        T delete_head();
        void Show_Queue(void); //从队首到队尾依次输出队列数据
    protected:
    private:
        stack<T> stack1;
        stack<T> stack2;
};
template<typename T>
void Queue_by_stack<T>::Show_Queue(void)
{
    T tmp;
    stack<T>  S1(stack1); // 将stack1的数据copy到S1
    stack<T>  S2(stack2);
    cout<<"\nThis is Show_Queue !\n";
    while(!S2.empty())  //先把S2中的所有数据清仓输出
    {
        cout<<S2.top()<<"  ";
        S2.pop();
    }
    while(!S1.empty()) //再把S1中的数据全部倒进S2
    {
            tmp = S1.top();
            S2.push(tmp);
            S1.pop();
    }
    while(!S2.empty())//再把S2中的所有数据清仓输出
    {
        cout<<S2.top()<<"  ";
        S2.pop();
    }

}

template<typename T>
T Queue_by_stack<T>::delete_head()
{
    T tmp;
    if (stack2.empty())  //删除元素  先判断栈2是否为空
    {
        while (!stack1.empty())  //栈2为空栈,把栈1中的数据全部倒入栈2
        {
            tmp = stack1.top();
            stack2.push(tmp);
            stack1.pop();
        }
    }
    if (stack2.empty()) //栈2仍为空,说明队列为空
    {
        return -1;
    }
    tmp = stack2.top();//如果栈2 不空的情况下,则栈2的栈顶就是队列的队首
    stack2.pop();
    return tmp;
}
template<typename T>
void Queue_by_stack<T>::append_tail( const T& node )
{
    stack1.push(node);
}
int main()
{
    Queue_by_stack<char> my_queue;
    my_queue.append_tail('a');
    my_queue.append_tail('b');
    my_queue.append_tail('c');
    my_queue.Show_Queue();


    my_queue.delete_head();
    my_queue.delete_head();
    my_queue.Show_Queue();

    my_queue.append_tail('d');
    my_queue.append_tail('e');
    my_queue.Show_Queue();

    my_queue.delete_head();
    my_queue.Show_Queue();
}
/**********************************
入栈顺序是 a b c d e
运行结果:

This is Show_Queue !
a  b  c
This is Show_Queue !
c
This is Show_Queue !
c  d  e
This is Show_Queue !
d  e
***********************************/


 

 

posted @ 2013-08-02 22:42  javawebsoa  Views(211)  Comments(0Edit  收藏  举报