數據結構之隊列的順序存儲結構 C語言版

前言

隊列是一種先進先出的線性表。隊列也有兩種存儲結構,這一篇我們來談談隊列的順序存儲結構

1.隊列的作用

操作系統方面:鼠標的運用
客服排隊方面:排隊等候
鍵盤方面:從鍵盤輸入到顯示器的輸出

2.隊列的表示形式

用數組表示隊列,爲了出隊不影響大量元素,所以出隊移動front指針,入隊移動rear指針。但是這還造成了一個問題:假溢出
假溢出
於是就想出了一種方法,隊列的順序存儲讓它用循環隊列的方式實現

3.用循環隊列表示

如果用循環隊列,那麼有三個問題:判斷隊滿的條件,判斷隊空的條件和隊列的長度
當隊列滿時,我們修改其條件,保留一個元素空間。就是說還有一個空閒元素時,我們就認爲隊滿了

1.判斷隊滿的條件
(rear+1)%M == front
取模的目的是爲了整合rear與front大小爲一個問題
隊滿
2.判斷隊空的條件:
front == rear;
3.計算隊列的長度:
(rear-front+M)%M

4.循環隊列的定義

typedef struct
{
	QElemType data[M];
	int front;
	int rear;
}SqQueue;

5.內容佈局

本篇主要包括了循環鏈表的入隊,出隊,還包括初始化,遍歷,清空等操作
1.入隊:

Q->data[Q->rear] = x;
Q->rear = (Q->rear+1)%M;//指針後移,若到最後則轉到數組頭部

2.出隊:

e = Q->data[Q->front];
Q->front = (Q->front+1)%M;

代碼如下

/*
程序名稱:鏈棧的建立與基本操作
編譯環境:vs2010
最後修改:2019.8.2
作者:xuan
*/
#include<stdio.h>
#include<stdlib.h>

#define M 5
#define OK 1
#define ERROR 0
typedef int Status;
typedef int QElemType;

//定義循環隊列
typedef struct
{
	QElemType data[M];
	int front;
	int rear;
}SqQueue;

Status InitQueue(SqQueue *Q);//初始化循環隊列
Status EnQueue(SqQueue *Q);//入隊
Status DeQueue(SqQueue *Q);//出隊
Status Display(SqQueue *Q);//顯示
Status Clear(SqQueue *Q);//置空

int main()
{
	Status i;
	SqQueue Q;
	int n=0;
	InitQueue(&Q);
	while(n!=-1)
	{
		printf("						\n");
		printf(" 1.入隊 2.出隊 3.清空隊 -1.退出 \n");
		scanf("%d",&n);
		switch(n)
		{
		case 1:
			i = EnQueue(&Q);
			if(i == ERROR)
				printf("失敗\n");
			Display(&Q);
			break;
		case 2:
			i = DeQueue(&Q);
			if(i == ERROR)
				printf("失敗\n");
			Display(&Q);
			break;
		case 3:
			Clear(&Q);
			printf("操作後的順序棧:\n");
			Display(&Q);
			break;
		}
	}
	return 0;
}

//初始化循環隊列
Status InitQueue(SqQueue *Q)
{
	Q->front = 0;
	Q->rear = 0;
	return OK;
}

//入隊
Status EnQueue(SqQueue *Q)
{
	QElemType x = 0;
	if((Q->rear+1)%M == Q->front)//隊滿
		return OK;
	printf("請輸入數據,-1時停止\n");
	while(x != -1)
	{
		scanf("%d",&x);
		if(x != -1)
		{
			Q->data[Q->rear] = x;
			Q->rear = (Q->rear+1)%M;//rear指向後一位,若到末尾則指向頭部
		}
	}
	return OK;
}

//出隊
Status DeQueue(SqQueue *Q)
{
	QElemType e;
	if(Q->front == Q->rear)//隊空
		return ERROR;
	e = Q->data[Q->front];
	Q->front = (Q->front+1)%M;
	printf("出隊的元素爲:%d\n",e);
	return OK;
}

//顯示
Status Display(SqQueue *Q)
{
	int size=0,i=0;
	size = (Q->rear-Q->front+M)%M;
	for(i=Q->front;i!=Q->rear;)
	{
		printf("%d ",Q->data[i]);
		i = (i+1)%M;
	}
	printf("\n");
	printf("隊列的長度爲:%d\n",size);
	return OK;
}

//置空
Status Clear(SqQueue *Q)
{
	Q->front = Q->rear;
	return OK;
}

運行結果

運行結果

後記

以上就是順序棧的表示和各種操作,喜歡的多多支持喔~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章