1. 程式人生 > >佇列——順序儲存結構及其基本運算(迴圈佇列)

佇列——順序儲存結構及其基本運算(迴圈佇列)

該文章主要介紹迴圈佇列的順序儲存結構以及相關運算。

標頭檔案:CSqQueue.h

template <typename T>
class SqQueueClass1				//迴圈佇列類模板
{
	T *data;  					//存放隊中元素
	int front, rear;			//隊頭和隊尾指標
public:
	//================迴圈隊基本運算演算法==========================
	SqQueueClass1();			//建構函式
	~SqQueueClass1();			//解構函式
	bool QueueEmpty1();			//判斷佇列是否為空
	bool enQueue1(T e);			//進佇列演算法
	bool deQueue1(T &e);		//出佇列演算法
	//================迴圈隊其他運算演算法=========================
	template <typename C>
	friend void Display(SqQueueClass1<C> &qu);					//從隊頭到隊尾輸出隊中所有元素
	
	template <typename C>
	friend int GetCount(SqQueueClass1<C> &qu);					//返回隊中元素個數
	
	template <typename C>
	friend bool enQueuek(SqQueueClass1<C> &qu, int k, C e);		//進隊第k個元素e
	
	template <typename C>
	friend bool deQueuek(SqQueueClass1<C> &qu, int k, C &e);	//出隊第k個元素e
};

原始檔:CSqQueue.cpp

#include <iostream>
#include "CSqQueue.h"
const int MaxSize = 100;
//================迴圈隊基本運算演算法==========================
template <typename T>
SqQueueClass1<T>::SqQueueClass1()		//建構函式
{
	data = new T[MaxSize];			
	front = rear = 0;					
}
template <typename T>
SqQueueClass1<T>::~SqQueueClass1()		//解構函式
{
	delete[] data;
}
template <typename T>
bool SqQueueClass1<T>::QueueEmpty1()	//判斷佇列是否為空
{
	return (front == rear);
}
template <typename T>
bool SqQueueClass1<T>::enQueue1(T e)	//進佇列演算法
{
	if ((rear + 1) % MaxSize == front)	
		return false;
	rear = (rear + 1) % MaxSize;
	data[rear] = e;
	return true;
}
template <typename T>
bool SqQueueClass1<T>::deQueue1(T &e)	//出佇列演算法
{
	if (front == rear)				
		return false;
	front = (front + 1) % MaxSize;
	e = data[front];
	return true;
}
//================迴圈隊基本其他運算演算法========================
template <typename T>
void Display(SqQueueClass1<T> &qu)		//從隊頭到隊尾輸出隊中所有元素
{
	int i = qu.front;
	while (i != qu.rear)
	{
		i = (i + 1) % MaxSize;
		cout << qu.data[i] << " ";
	}
	cout << endl;
}
template <typename T>
int GetCount(SqQueueClass1<T> &qu)		//返回隊中元素個數
{
	return ((qu.rear - qu.front + MaxSize) % MaxSize);
}
template <typename T>
bool enQueuek(SqQueueClass1<T> &qu, int k, T e) //進隊第k個元素e
{
	T x;
	int i = 1, n = GetCount(qu);
	if (k<1 || k>n + 1) return false;	
	if (k <= n)
		for (i = 1; i <= n; i++)			
		{
			if (i == k) qu.enQueue1(e);
			qu.deQueue1(x);			
			qu.enQueue1(x);			
		}
	else qu.enQueue1(e);			//k=n+1時直接進隊e
	return true;
}
template <typename T>
bool deQueuek(SqQueueClass1<T> &qu, int k, T &e)	//出隊第k個元素e
{
	T x;
	int i = 1, n = GetCount(qu);
	if (k<1 || k>n) return false;	
	for (i = 1; i <= n; i++)			
	{
		qu.deQueue1(x);				
		if (i != k) qu.enQueue1(x);	
		else e = x;					
	}
	return true;
}

主函式:main.cpp

#include<iostream>
#include"CSqQueue.cpp"
using namespace std;
//=================迴圈隊基本運算演算法====================
void main1()
{	
	SqQueueClass1<char> sq;			//定義一個字元順序隊sq
	char e;
	cout << "建立一個空隊sq\n";
	cout << "隊sq" << (sq.QueueEmpty1()?"空":"不空") << endl;
	cout << "元素a進隊\n"; sq.enQueue1('a');
	cout << "元素b進隊\n"; sq.enQueue1('b');
	cout << "元素c進隊\n"; sq.enQueue1('c');
	cout << "元素d進隊\n"; sq.enQueue1('d');
	cout << "元素e進隊\n"; sq.enQueue1('e');
	cout << "隊sq" << (sq.QueueEmpty1()?"空":"不空") << endl;
	cout << "所有元素出隊次序:";
	while (!sq.QueueEmpty1())		//隊不空迴圈
	{
		sq.deQueue1(e);				//出隊元素e
		cout << e << " ";			//輸出元素e
	}
	cout << endl;
	cout << "銷燬隊sq" << endl;
}
//==================迴圈隊基本其他運算演算法=====================
void main()
{
	SqQueueClass1<char> sq;			//定義一個字元順序隊sq
	char e;
	cout << "建立一個空隊sq\n";
	cout << "元素a進隊\n"; sq.enQueue1('a');
	cout << "元素b進隊\n"; sq.enQueue1('b');
	cout << "元素c進隊\n"; sq.enQueue1('c');
	cout << "元素d進隊\n"; sq.enQueue1('d');
	cout << "元素e進隊\n"; sq.enQueue1('e');
	cout << "sq中元素個數:" << GetCount(sq) << endl;
	cout << "進隊第2個元素x" << endl;
	enQueuek(sq, 2, 'x');
	cout << "隊頭到隊尾元素:"; Display(sq);
	cout << "出隊第4個元素" << endl;
	deQueuek(sq, 4, e);
	cout << "第4個元素為" << e << endl;
	cout << "隊頭到隊尾元素:"; Display(sq);
	cout << "銷燬隊sq" << endl;
}