剑指offer--面试题7


//两个栈实现一个队列

#include<stack>   //STL
#include<iostream>

using namespace std;

template<class T>
class CQueue
{
    public:
        CQueue();
        ~CQueue();

        void appendTail(const T& node);
        T deleteHead();
    private:
        stack<T> stack1;
        stack<T> stack2;
};

//思路:一个栈做添加队尾元素用;另一个做删除队首元素用。
//      操作时,对应栈有数据,另一个为空。

template<class T>
CQueue<T>::CQueue()
{
}

template<class T>
CQueue<T>::~CQueue()
{
}
//stack1作为添加队尾元素的栈
template<class T>
void CQueue<T>::appendTail(const T& node)
{
    if(stack1.empty())
    {
        while(!stack2.empty())
        {
            T temp = stack2.top();
            stack1.push(temp);
            stack2.pop();
        }
        stack1.push(node);
    }
    else
        stack1.push(node);
}

//stack2作为删除队首元素的栈
template<class T>
T CQueue<T>::deleteHead()
{
    T Head;
    if(stack2.empty())
    {
        if(stack1.empty())
        {
            cerr<<"This Queue is already empty!"
                <<"Have no to be deleted!"<<endl;
                exit(1);
        }
        while(!stack1.empty())
        {
            T temp = stack1.top();
            stack2.push(temp);
            stack1.pop();
        }
        Head = stack2.top();
        stack2.pop();
    }
    else
    {
        Head = stack2.top();
        stack2.pop();
    }

    return Head;
}


int main(int argc, char* argv[])
{
    CQueue<char> q1;
    q1.appendTail('a');
    q1.appendTail('b');
    q1.appendTail('c');
    q1.appendTail('d');
    q1.appendTail('e');

    char Head = q1.deleteHead();
    cout<<Head<<endl;
    Head = q1.deleteHead();
    cout<<Head<<endl;

    q1.appendTail('f');
    q1.appendTail('g');
    Head = q1.deleteHead();
    cout<<Head<<endl;
    Head = q1.deleteHead();
    cout<<Head<<endl;
    Head = q1.deleteHead();
    cout<<Head<<endl;
    Head = q1.deleteHead();
    cout<<Head<<endl;
    return 0;
}

自己所做如上所示。思路就是:一个做删除栈;一个做添加栈。

 

 相比较于作者的思想,虽然大体一致,但自己的思想有多余的部分:

在添加元素的时候,无论stack1是否为空,作者采取的策略为直接入栈,而自己却是先将stack2中的元素再弹出压入stack1,这一步根本就是多余的!

作者代码如下:(自己默写)

//作者代码,更简洁!
//stack1做入队操作,直接入队
template<typename T>
void CQueue<T>::appendTail(const T& node)
{
    stack1.push(node);
}

//stack2做出队操作
template<typename T>
T CQueue<T>::deleteHead()
{
    if(stack2.empty())
    {
        while(stack1.empty())
        {
            T head = stack1.top();
            stack2.push(head);
            stack1.pop();
        }
    }

    if(stack2.empty())
        throw new exception("queue is empty.");

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

    return Head;
}

作者代码的结构安排更紧凑,更简洁!!!

posted on 2013-08-07 23:32  -赶鸭子上架-  阅读(310)  评论(0编辑  收藏  举报