劍指Offer第7題(用兩個棧實現隊列)

(本博客旨在個人總結回顧)

題目描述:

       用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數appendTail和deleteHead,分別完成在隊列尾部插入結點和在隊列頭部刪除結點的功能。

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

    void appendTail(const T& node);
    T deleteHead();

private:
    stack<T> stack1;
    stack<T> stack2;
};

首先肯定理解數據結構隊列和棧的結構特點:

①棧爲先入後出結構。

②隊列爲先入先出結構。

完整程序:

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

    void appendTail(const T& node);
    T deleteHead();

private:
    stack<T> stack1;
    stack<T> stack2;
};

template <typename T>
T CQueue<T>::deleteHead()
{
    if (stack2.size() == 0)
    {
        while (stack1.size() > 0)
        {
            T node = stack1.top();
            stack1.pop();
            stack2.push(node);
        }
    }
    if (stack2.size() == 0)
    {
        throw new std::exception("queue is empty");
    }
    else
    {
        T node = stack2.top();
        stack2.pop();
        return node;
    }
}

template <typename T>
void CQueue<T>::appendTail(const T& node)
{
    stack1.push(node);
}

int _tmain(int argc, _TCHAR* argv[])
{    
    //測試例子1 插入兩個數後刪除
    CQueue<int> queue1;
    cout << "測試例子1:" << endl << "插入:1, 2" << endl;
    queue1.appendTail(1);
    queue1.appendTail(2);
    cout << "刪除:" << queue1.deleteHead();
    cout << ", " << queue1.deleteHead() << endl;
    

    //測試例子2 插入兩個數後刪除一個再插入兩個,再全部刪除 
    CQueue<int> queue2;
    cout << "測試例子2:" << endl << "插入:3, 4" << endl;
    queue2.appendTail(3);
    queue2.appendTail(4);
    cout << "刪除:" << queue2.deleteHead() << endl;
    cout << "插入:5, 6" << endl;
    queue2.appendTail(5);
    queue2.appendTail(6);
    cout << "刪除:" << queue2.deleteHead();
    cout << ", " << queue2.deleteHead();
    cout << ", " << queue2.deleteHead() << endl;

    //直接刪除沒有數據的隊列

    system("pause");
    return 0;
}

運行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章