題目
用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 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幾行,但形成正確的思路卻不容易。應聘者能否通過具體的例子分析問題,通過畫圖的手段把抽象的問題形象化,從而解決這個相對比較複雜的問題,是能否順利通過面試的關鍵。
相關題目
用兩個隊列實現一個棧