C++实现顺序队列

@这篇文档是由C++代码实现的队列

队列就是先进先出的一种数据结构,这篇文档通过数组实现队列,要求是:队列是线性的(即队列的长度初始化后给定了,如果队列插入元素到了最后一个位置表示队列已满不能再插入新的元素,删除元素也只能从队列的队头开始删除),其次队列的插入类型没有定,所以建立的是模板类和函数模板,最后通过调用类模板在main()函数中实现。

本文是以Visual Studio中新建的C++win32的控制台应用程序实现的,其中建立了头文件和源文件以及实现main()的demo文件,分别是LinerQueue.h和LinerQueue.cpp和demo.cpp文件。

LinerQueue.h文件

#ifndef LINERQUEUE_H
#define LINERQUEUE_H

template <class T>
class LinerQueue
{
public:
	LinerQueue(int length);
	virtual ~LinerQueue();
	int QueueLen();
	bool QueueEmpty();
	bool QueueFull();
	void ClearQueue();
	bool InsertElement(T element);
	bool GetElement(T &element);
	void TraversalQueue();
private:
	T* m_iQueue;
	int m_iHead;
	int m_iTail;
	int m_iQueueLength;
	int m_iQueueCapacity;
};

#endif

LinerQueue.cpp文件

#include "LinerQueue.h"
#include <iostream>
using namespace std;

//队列的构造函数
template <class T>
LinerQueue<T>::LinerQueue(int length)
{
	m_iQueueCapacity = length;
	m_iQueue = new T[m_iQueueCapacity];
	m_iHead = 0;
	m_iTail = 0;
	m_iQueueLength = 0;
	//ClearQueue();
}

//队列的析构函数
template <class T>
LinerQueue<T>::~LinerQueue()
{
	delete []m_iQueue;
	m_iQueue = NULL;
}

//队列的队长函数
template <class T>
int LinerQueue<T>::QueueLen()
{
	return m_iQueueLength;
}

//队列的判空函数
template <class T>
bool LinerQueue<T>::QueueEmpty()
{
	return m_iQueueLength==0?true:false;
}

//队列的判满函数
template <class T>
bool LinerQueue<T>::QueueFull()
{
	return m_iTail==m_iQueueCapacity?true:false;
}

//队列的清空函数
template <class T>
void LinerQueue<T>::ClearQueue()
{
	m_iHead = 0;
	m_iTail = 0;
	m_iQueueLength = 0;
}

//队列新插入元素函数
template <class T>
bool LinerQueue<T>::InsertElement(T element)
{
	if(QueueFull())
	{
		cout << "该队列已满,不能再插入新的元素!" << endl;
		return false;
	}
	else
	{
		m_iQueue[m_iTail] = element;
		m_iQueueLength++;
		m_iTail++;

	}
}

//队列取队头元素的函数
template <class T>
bool LinerQueue<T>::GetElement(T &element)
{
	if(QueueEmpty())
	{
		cout << "该队列为空,不能取到队头元素!" << endl;
		return false;
	}
	else
	{
		element = m_iQueue[m_iHead];
		m_iQueueLength--;
		m_iHead++;
	}
}

//队列的遍历函数
template <class T>
void LinerQueue<T>::TraversalQueue()
{
	for(int i=m_iHead;i<(m_iHead+m_iQueueLength);i++)
	{
		cout << m_iQueue[i] << endl; 
	}
}


demo.cpp文件(这个文件中实例化模板类一定要注意将Liner Queue.cpp文件包含进来,要不然会报错)

#include "LinerQueue.h"
#include "LinerQueue.cpp"
#include <iostream>
#include <stdlib.h>
using namespace std;

int main(void)
{
	LinerQueue<double> *p = new LinerQueue<double>(5);
	p->InsertElement(10.1);
	p->InsertElement(11.2);
	p->InsertElement(12.3);
	p->InsertElement(13.4);
	p->InsertElement(14.5);
	p->TraversalQueue();

	double e=0;
	p->GetElement(e);
	cout << endl;
	cout << e << endl;
	cout << endl;
	p->TraversalQueue();

	cout << endl;
	p->ClearQueue();
	cout << endl;
	cout << p->QueueLen()<< endl;


	delete []p;
	p = NULL;
	system("pause");
	return 0;
}
这道题其实是华为的面试题,当时是面试官直接让用C++语言,通过数组手写代码实现一个队列,先进先出的线性队列。当时我还是很懵的,觉得调几个函数就应该可以了,但是没有那么简单,最后没有答出来。现在想起来这道题也就这么简单,没有多大难处,只不过要了解的就是C++中的内存管理,然后就是C++语言的一些基础就是了。还有以后写这种数据结构的代码还必须知道C++中的模板类和模板函数,其实都挺简单,不过还是要了解。
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值