用两个栈实现队列

问题描述:

用两个栈实现队列,队列的声明如下,请实现他的两个函数AppendTail和DeleteHead,分别完成在队列

尾部插入节点和在队列头部删除节点的功能。

template<typename T>
class CQuene
{
public:
    CQuene(){};
    ~CQuene(){};

    void AppendTail(const T &Node);
    T DeleteHead();
private:
    stack<T>stack1;
    stack<T>stack2;
};

思路分析:

上述声明中包含了两个栈,因此这道题的意图是要求我们操作这两个后进先出的栈实现一个先进先出的队列。

stack1中存放新入队列的元素。当元素要出队列时,判断stack2是否为空,若为空则将stack1中的元素全部压入

stack2,这是stack2中栈顶的元素一次是最早入队的元素。若stack2不为空之前出栈一个元素则为队列的首元素。

新元素进队还是先压入stack1.

参考代码:

template<typename T>
void CQuene<T>::AppendTail(const T &Node)
{
    stack1.push(Node);
}

template<typename T>
T CQuene<T>::DeleteHead()
{
    if (stack2.size() <= 0)
    {
        while(stack1.size()>0)
        {
            T &data = stack1.top();
            stack1.pop();
            stack2.push(data);
        }
    }
    if (stack2.size() == 0)
    {
        throw new exception("quene is empty");
    }

    T head = stack2.top();
    stack2.pop();

    return head;
}
int _tmain(int argc, _TCHAR* argv[])
{
    int a[] = {1,2,4,7,3,5,6,8};
    int b[] = {4,7,2,1,5,3,6,8};
    CQuene<int> q;

    for (int i = 0;i < 8;i++)
    {
        q.AppendTail(i);
    }
    for (int i = 0;i < 4;i++)
    {
       
        cout<<q.DeleteHead()<<endl;;
    }
    q.AppendTail(100);
    for (int i = 0;i < 5;i++)
    {

        cout<<q.DeleteHead()<<endl;;
    }

    getchar();
    return 0;
}

思考:

主要是能够用栈模拟出队列的过程。两个如何操作。在vs2008上编译时出了问题,首先它不支持

模版函数和类的申明分文件实现。其次,我试了下必须在cpp文件中才能编译通过。过段时间把全

部代码在G++编译一下看看差别。

生命在于折腾,生活就是如此的丰富多彩
原文地址:https://www.cnblogs.com/Mr-Zhong/p/4122002.html