数据结构(6) 顺序队列 c++ 模板实现

顺序队列

 
1、顺序队列
  (1)顺序队列的定义
   队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。

(2) 顺序队列的表示

  ①和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素。

  ②由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应置为0。

数据结构(6) 顺序队列 c++ 模板实现_第1张图片

//SeqQueue.h
template <typename Type> class SeqQueue
{
private:
	int m_front;
	int m_rear;
	int m_nMaxsize;
	int m_count;
	Type *m_pelements;
public:
	SeqQueue(int size=10):m_front(0),m_rear(0),m_nMaxsize(size),m_count(0),m_pelements(NULL){};
	~SeqQueue()
	{delete []m_pelements;}
public:
	void Init();
	bool IsFull();
	bool IsEmpty();
	Type Delete();
	void ClearQueue();
	Type Peek();
	bool Append(const Type item);
	int Length();
	void Print();
};

template <typename Type> void SeqQueue<Type>::Init()
{
	m_pelements=new(nothrow) Type[m_nMaxsize];
	if(m_pelements==NULL)
		{cout<<"allocated failed!"<<endl;
	    exit(-1);} 
}

template <typename Type> bool SeqQueue<Type>::IsEmpty()
{return m_count==0;}

template <typename Type> bool SeqQueue<Type>::IsFull()
{return m_count==m_nMaxsize;}

template <typename Type> Type SeqQueue<Type>:: Delete()//删去front所指的元素,然后将front加1并返回被删元素
{
	if(m_rear == m_front)
	{
		cout<<"The Queue is empty"<<endl;
	    return false;
	}
	Type temp=m_pelements[m_front];
	m_front=(m_front+1)%m_nMaxsize;//兼容循环队列
	--m_count;
	return temp;
}

template <typename Type> void SeqQueue<Type>::ClearQueue()
{
	m_rear=0;
	m_front=0;
	m_count=0;
}
/*另一种方法是不设置count,而是设置一个队列满标志位
  if(flag==1) return MaxSize;//队列满
  return (rear-front+MaxSize)%MaxSize;//兼容循环队列*/
template <typename Type> int SeqQueue<Type>::Length()
{ return m_count;}
 
template <typename Type> Type SeqQueue<Type>:: Peek()
{return m_pelements[m_front];}

template <typename Type> bool SeqQueue<Type>:: Append(const Type item)//将新元素插入rear所指的位置,然后将rear加1
{
	if(m_count==m_nMaxsize)
	{cout<<"The Queue is Full"<<endl;
	return false;}
	m_pelements[m_rear]=item;
	m_rear=(m_rear+1)%m_nMaxsize;
	++m_count;
	return true;
}

template <typename Type> void SeqQueue<Type>::Print()
{
	cout<<"front";
	for(int i=m_front;i<m_front+m_count;i++)
		cout<<"--->"<<m_pelements[i];
	cout<<endl;
}

// SeqQueue.cpp

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


int _tmain(int argc, _TCHAR* argv[])
{
	SeqQueue<int> queue;
	queue.Init();
	queue.Delete();
	int init[10]={1,6,9,0,2,5,8,3,7,4};
	for(int i=0;i<5;i++){
		queue.Append(init[i]);
	}
	queue.Print();

	cout<<queue.Delete()<<endl;
	queue.Print();

	for(int i=5;i<10;i++){
		queue.Append(init[i]);
	}
	queue.Print();

	cout<<queue.Peek()<<endl;

	queue.ClearQueue();
	queue.Print();

	queue.Append(1);
	queue.Print();

	return 0;
}




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