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++中的模板类和模板函数,其实都挺简单,不过还是要了解。

你可能感兴趣的:(C++,数据结构)