1. 程式人生 > >佇列的順序表示形式和實現

佇列的順序表示形式和實現

佇列 的順序表示是用一組地址連續的儲存單元依次存放佇列中的
  各個元素,並用指標front指向隊頭,指標rear指向隊尾。
  一般約定:front指標始終指向隊頭元素,而rear指標是指向隊尾
  元素的下一個位置。

假溢位:當隊滿的時候,若還有元素進隊,rear指標將會越界,從而
  導致程式出錯。而此時又不易像順序表那樣擴大陣列空間,因為佇列
  的實際可用空間並未裝滿。

處理假溢位:一種方法是將front指標和rear指標一起平移到陣列的
  起始位置;另一種方法就是將佇列假想為一個迴圈的環狀空間,稱之
  為迴圈佇列。

迴圈佇列的侷限性:使用者必須為它假設一個最大長度,若佇列最大長度
  無法估計,則不宜採用迴圈佇列結構。


迴圈佇列的型別定義及基本操作:
typedef struct
{
 QElemType *base;
 int front, rear;
}SqQueue;

初始化迴圈佇列
int InitQueue(SqQueue &Q)
{
 Q.base = (QElemType*)malloc(MaxQSize*sizeof(QElemType));
 if (Q.base == NULL)
  exit(OVERFLOW);
 Q.front = Q.rear = 0;
 return 0;
}

將迴圈佇列清空
int ClearQueue(SqQueue &Q)
{
 Q.front = Q.rear = 0;
}

求佇列元素的個數
int QueueLength(SqQueue Q)
{
 return (Q.rear - Q.front + MaxQSize) % MaxQSize;
}

插入元素到迴圈佇列
int EnSqQueue(SqQueue &Q, QElemType e)
{
 if ((Q.rear + 1) % MaxQSize == Q.front)
  return ERROR; //佇列滿
 Q.base[Q.rear] = e; //元素e入隊
 Q.rear = (Q.rear + 1) % MaxQSize; //修改隊尾指標
 return OK;
}

從迴圈佇列中刪除元素
int DeSqueue(SqQueue &Q, QElemType &e)
{
 if (Q.front == Q.rear)
  return ERROR;
 e = Q.base[Q.front]; //取隊頭元素至e
 Q.front = (Q.front + 1) % MaxQSize; //修改隊頭指標
 return OK;
}

判斷一個迴圈佇列是否為空佇列
int SqQueue(SqQueue Q)
{
 if (Q.front == Q.rear)
  return TRUE;
 else
  return FALSE;
}

//迴圈佇列的簡單操作
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MaxQSize 10

typedef struct
{
	int *base;	//資料儲存區起始地址
	int front, rear;	//隊頭、隊尾元素所在單元號
}SqQueue;

int InitQueue(SqQueue &Q);
int ClearQueue(SqQueue &Q);
int QueueLength(SqQueue Q);
int EnSqQueue(SqQueue &Q, int e);
int DeSqQueue(SqQueue &Q, int &e);
int SqQueueEmpty(SqQueue Q);

int main(void)
{
	int i, e;
	SqQueue Q;
	InitQueue(Q);
	for (i=0; i<MaxQSize; i++)	//只有MaxQSize-1個數據進佇列
		EnSqQueue(Q, i);
	i = QueueLength(Q);
	printf("佇列裡的元素有%d個\n", i);
	for (i=0; i<3; i++)
	{
		DeSqQueue(Q, e);
		printf("%d ", e);
	}
	printf("\n");
	i = QueueLength(Q);
	printf("佇列裡的元素有%d個\n", i);
	for (i=10; i<12; i++)
		EnSqQueue(Q, i);
	i = QueueLength(Q);
	printf("佇列裡的元素有%d個\n", i);
	ClearQueue(Q);
	i = QueueLength(Q);
	printf("佇列裡的元素有%d個\n", i);
	return 0;
}

int InitQueue(SqQueue &Q)
{
	Q.base = (int *)malloc(MaxQSize*sizeof(int));
	if (Q.base == NULL)
		exit(1);
	Q.front = Q.rear = 0;
	return 0;
}

int ClearQueue(SqQueue &Q)
{
	Q.front = Q.rear =0;
	return 0;
}

int QueueLength(SqQueue Q)
{
	return (Q.rear - Q.front +MaxQSize) % MaxQSize;
}

int EnSqQueue(SqQueue &Q, int e)
{
	if ((Q.rear+1)%MaxQSize == Q.front)
		return 1;
	Q.base[Q.rear] = e;
	Q.rear = (Q.rear + 1) % MaxQSize;
	return 0;
}

int DeSqQueue(SqQueue &Q, int &e)
{
	if (SqQueueEmpty(Q))
		return 1;
	e = Q.base[Q.front];
	Q.front = (Q.front + 1) % MaxQSize;
	return 0;
}

int SqQueueEmpty(SqQueue Q)
{
	if (Q.rear == Q.front)
		return 1;
	return 0;
}