您的位置:首页 > 编程语言 > C语言/C++

用两个栈实现队列(C++ 和 Python 实现)

2017-10-15 19:43 651 查看
(说明:本博客中的题目题目详细说明参考代码均摘自 “何海涛《剑指Offer:名企面试官精讲典型编程题》2012年”)

题目

  用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点功能。

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

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


进一步详细说明:

  在上述队列的声明中可以看出,一个队列包含两个栈 stack1 和 stack2,因此这道题的意图是要求我们操作这两个 “先进后出” 的栈实现一个 “先进先出” 的队列 CQueue。

算法设计思想

  因为栈是后进先出的数据结构,当将数据依次压入第一个栈后,再依次从这个栈弹出,压入第二个栈,如果此时从第二个栈中获取数据,表现正好像一个 “先进先出” 的队列数据结构。

  具体来说,使用两个栈实现一个队列,可以考虑用第一个栈(stack1)存放输入的元素(队尾元素),从第二个栈(stack2)获取队头元素。当第一栈(stack1)为空时,将第二个栈(stack2)中的全部元素依次弹出,再依次压入第一个栈中。其过程如图 2.8 所示,

// 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;
}


View Code
7. 参考代码下载

项目 07_QueueWithTwoStacks 下载: 百度网盘

何海涛《剑指Offer:名企面试官精讲典型编程题》 所有参考代码下载:百度网盘

参考资料

[1] 何海涛. 剑指 Offer:名企面试官精讲典型编程题 [M]. 北京:电子工业出版社,2012. 58-62.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: