1. 程式人生 > >資料結構-迴圈佇列的基本操作函式實現(含全部程式碼)

資料結構-迴圈佇列的基本操作函式實現(含全部程式碼)

    主要包含以下函式:

  •    InitQueue(SqQueue &Q)              引數:迴圈佇列Q 功能:初始化迴圈佇列Q 時間複雜度:O(1)
  •     QueueEmpty(SqQueue Q)              引數:迴圈佇列Q 功能:判斷隊空與否 時間複雜度:O(1)
  •     EnQueue(SqQueue &Q,QElemType e)    引數:迴圈佇列Q,元素e 功能:使元素e入隊 時間複雜度:O(1)
  •     DeQueue(SqQueue &Q,QElemType &e)   引數:迴圈佇列Q,元素e 功能:隊頭出隊,用e返回值 時間複雜度:O(1)
  •     GetHead(SqQueue &Q,QElemType &e)   引數:迴圈佇列Q,元素e 功能:獲取隊頭元素e 時間複雜度:O(1)

程式碼:

/*
    Project: sequentially_cyclic_queue (順序結構迴圈佇列)
    Date:    2018/09/16
    Author:  Frank Yu
	InitQueue(SqQueue &Q)              引數:迴圈佇列Q 功能:初始化迴圈佇列Q 時間複雜度:O(1)
	QueueEmpty(SqQueue Q)              引數:迴圈佇列Q 功能:判斷隊空與否 時間複雜度:O(1)
	EnQueue(SqQueue &Q,QElemType e)    引數:迴圈佇列Q,元素e 功能:使元素e入隊 時間複雜度:O(1)
	DeQueue(SqQueue &Q,QElemType &e)   引數:迴圈佇列Q,元素e 功能:隊頭出隊,用e返回值 時間複雜度:O(1)
	GetHead(SqQueue &Q,QElemType &e)   引數:迴圈佇列Q,元素e 功能:獲取隊頭元素e 時間複雜度:O(1)
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
#define Status int
#define QElemType int
#define MaxQSize 100
//迴圈佇列資料結構
typedef struct
{
	QElemType data[MaxQSize];//資料域
	int front,rear;          //隊頭隊尾指標
}SqQueue;
//***************************基本操作函式**************************//
//初始化函式
Status InitQueue(SqQueue &Q)
{
	Q.front=Q.rear=0;
	return 1;
}
//判斷隊空函式
bool QueueEmpty(SqQueue Q)
{
	if(Q.front!=Q.rear)return false;
	else return true;
}
//入隊函式
bool EnQueue(SqQueue &Q,QElemType e)
{
	if((Q.rear+1)%MaxQSize==Q.front)return false; //佇列滿 犧牲一個以判斷
	Q.data[Q.rear]=e;
	Q.rear=(Q.rear+1)%MaxQSize;//指標加1 取模
	return true;
}
//出隊函式
bool DeQueue(SqQueue &Q,QElemType &e)
{
	if(Q.front==Q.rear)return false;//隊空 其實可以呼叫QueueEmpty 不然要它幹啥呢 
	                                //嚴蔚敏版 給了判空函式,但在其他基本操作函式中也沒用
	e=Q.data[Q.front];
	Q.front=(Q.front+1)%MaxQSize;////指標加1 取模
	return true;
}
//取隊頭
bool GetHead(SqQueue &Q,QElemType &e)
{
	if(Q.front==Q.rear)return false;//隊空 其實可以呼叫QueueEmpty 不然要它幹啥呢 
	                                //嚴蔚敏版 給了判空函式,但在其他基本操作函式中也沒用
	e=Q.data[Q.front];
	return true;
}
//**************************功能實現函式****************************//
//入隊功能函式 呼叫EnQueue函式
void EnterToQueue(SqQueue &Q)
{
	int n;QElemType e;int flag;
	printf("請輸入入隊元素個數(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	 printf("請輸入第%d個元素的值:",i+1);
	 scanf("%d",&e);
	 flag=EnQueue(Q,e);
	 if(flag)printf("%d已入隊\n",e);
	 else {printf("隊已滿!!!\n");break;}
	}
}
//出隊函式 呼叫DeQueue函式
void DeleteFromQueue(SqQueue &Q)
{
	int n;QElemType e;int flag;
	printf("請輸入出隊元素個數(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	 flag=DeQueue(Q,e);
	 if(flag)printf("%d已出隊\n",e);
	 else {printf("隊已空!!!\n");break;}
	}
}
//獲得隊頭元素 呼叫GetHead函式
void GetHeadOfQueue(SqQueue Q)
{
	QElemType e;bool flag; 
	flag=GetHead(Q,e);
	if(flag)printf("隊頭元素為:%d\n",e);
	else printf("隊已空!!!\n");
}
//選單
void menu()
{
   printf("********1.入隊          2.出隊*********\n");
   printf("********3.取隊頭元素    4.退出*********\n");
}
//主函式
int main()
{
	SqQueue Q;int choice;
	InitQueue(Q);
	while(1)
	{
	menu();
	printf("請輸入選單序號:\n");
	scanf("%d",&choice);
	if(choice==4) break;
	switch(choice)
	{
	case 1:EnterToQueue(Q);break;
	case 2:DeleteFromQueue(Q);break;
	case 3:GetHeadOfQueue(Q);break;
	default:printf("輸入錯誤!!!\n");
	}
	}
	return 0;
}

結果截圖:

結果截圖

有問題請下方評論,轉載請註明出處,並附有原文連結,謝謝!如有侵權,請及時聯絡。