前言
隊列是一種先進先出的線性表。隊列也有兩種存儲結構,這一篇我們來談談隊列的順序存儲結構
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;
}
運行結果
後記
以上就是順序棧的表示和各種操作,喜歡的多多支持喔~