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

分析

在上述隊列的聲明中可以看出,一個隊列包含了兩個棧stack1和stack2,因此這道題的意圖是要求我們操作這兩個“先進後出”的棧實現一個“先進先出”的隊列CQueue。

可以將一個棧作爲插入棧(stack1),另一個作爲刪除棧(stack2)。即,入隊的時候需要往stack1裏插入,出隊的時候,需要在stack2裏刪除。

測試用例&代碼

(1)往空的隊列裏添加、刪除元素

(2)往非空的隊列裏添加、刪除元素

(3)連續刪除元素直至隊列爲空

// QueueWithTwoStacks.cpp : Defines the entry point for the console application.
//

// 《劍指Offer——名企面試官精講典型編程題》代碼
// 著作權所有者:何海濤

#include "stdafx.h"
#include "Queue.h"

void Test(char actual, char expected)
{
    if(actual == expected)
        printf("Test passed.\n");
    else
        printf("Test failed.\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    CQueue<char> queue;

    queue.appendTail('a');
    queue.appendTail('b');
    queue.appendTail('c');

    char head = queue.deleteHead();
    Test(head, 'a');

    head = queue.deleteHead();
    Test(head, 'b');

    queue.appendTail('d');
    head = queue.deleteHead();
    Test(head, 'c');

    queue.appendTail('e');
    head = queue.deleteHead();
    Test(head, 'd');

    head = queue.deleteHead();
    Test(head, 'e');

    return 0;
}

#pragma once
#include <stack>
#include <exception>

using namespace std;

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> CQueue<T>::CQueue(void)
{
}

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

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

template<typename T> T CQueue<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("queue is empty");

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

    return head;
}

本題考點

(1)對棧和隊列的理解

(2)寫與模塊相關的代碼的能力

(3)分析複雜問題的能力。本題解法的代碼雖然只有20幾行,但形成正確的思路卻不容易。應聘者能否通過具體的例子分析問題,通過畫圖的手段把抽象的問題形象化,從而解決這個相對比較複雜的問題,是能否順利通過面試的關鍵。

相關題目

用兩個隊列實現一個棧

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