《剑指Offer——面试题9:用两个栈实现队列》代码

Posted 穿迷彩服的鲨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指Offer——面试题9:用两个栈实现队列》代码相关的知识,希望对你有一定的参考价值。


前言

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


一、示例

示例 1:

输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:

输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

二、代码解析

1.新建Queue.h文件

代码如下(示例):

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

#pragma once
#include<exception>
#include<stack>
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)
{
	while (!stack1.empty())
	{
		stack1.pop();
	}
	while (!stack2.empty())
	{
		stack2.pop();
	}
}

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

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

template<typename T>
T CQueue<T>::deleteHead()           //删除栈顶元素
{
	if (stack2.size() <= 0)
	{
		while (stack1.size() > 0)
		{
			T& data = stack1.top(); //拿到栈顶1元素
			stack1.pop();           //移除栈顶1元素
			stack2.push(data);      //压入栈2
		}
	}

	if (stack2.size() == 0)         //倒序换栈错误
	{
		throw new exception("queue is empty");
	}

	T head = stack2.top();      //拿到栈顶2元素
	stack2.pop();               //移除栈顶2元素

	return head;
}

2.新建.cpp文件

代码如下(示例):

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

#include"Queue.h"

// ====================测试代码====================
void Test(char actual, char expected)
{
	if (actual == expected)
	{
		printf("Test passed.\\n");
	}
	else
	{
		printf("Test faild.\\n");
	}
}

int main(int argc, char* 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;
}

3.结果

以上是关于《剑指Offer——面试题9:用两个栈实现队列》代码的主要内容,如果未能解决你的问题,请参考以下文章

校招面试 之 剑指offer第9-1题 用两个栈实现一个队列

校招面试 之 剑指offer第9-2题 用两个队列实现一个栈

[剑指offer]面试题7:用两个栈实现队列

剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈

剑指Offer - 面试题9:用俩个栈实现队列

剑指Offer:面试题09. 用两个栈实现队列