剑指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;
}

运行结果:

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