题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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几行,但形成正确的思路却不容易。应聘者能否通过具体的例子分析问题,通过画图的手段把抽象的问题形象化,从而解决这个相对比较复杂的问题,是能否顺利通过面试的关键。
相关题目
用两个队列实现一个栈