數據結構第三章,隊列,期末不掛科指南,第4篇

隊列

這篇博客主要介紹一下隊列的概念,並且採用C語言,編寫兩種存儲實現方式:順序存儲鏈式存儲,當然還有常規的隊列基本操作的實現算法

隊列基本概念

標準解釋:隊列(Queue)是有限個****同類型數據元素的線性序列,是一種先進先出(First In First Out FIFO)的線性表,新鍵入的數據元素插在隊列尾端,出隊列的數據元素在隊列首部被刪除。

教材中給了一個示意圖,不錯

在這裏插入圖片描述

順序隊列結構類型中有三個域:data、front、rear。

data:一維數組,存儲隊列中的數據元素
font:指向隊列首元素的前一個單元
rear:指向實際的隊列尾元素單元

參考示意圖

在這裏插入圖片描述
入隊列操作可以用兩條賦值語句

SQ.rear = SQ.rear+1;
SQ.data[SQ.rear] = x;

出隊列操作可以用一條語句完成

SQ.front = SQ.front+1

但是,會出現一些問題,通過示意圖說明一下

在這裏插入圖片描述
當然還有一種情況,一邊入隊列,一邊出隊列
注意下圖,SQ.front下面還有空間
在這裏插入圖片描述

所以爲了解決這種假溢出問題,聰明的開發人員,想出來新的解決辦法了,造一個環兒~

循環隊列

下面看一個圖,重點看一下SQ.rear與SQ.front的對應位置

在這裏插入圖片描述
如果上述圖翻譯成C語言代碼,入隊核心邏輯爲

SQ.rear = (SQ.rear+1) % maxsize ; 
SQ.data[SQ.rear] = x;

出隊列的核心邏輯爲

SQ.front = (SQ.front+1)%maxsize;

你在學習的時候,肯定對SQ.rear+1SQ.front+1有疑問

我們舉例來說明一下吧

在這裏插入圖片描述

順序隊列的C語言實現

接下來難度指數上升,開始用C語言編寫代碼吧

一頓操作之後,還是比較簡單的,總之不寫鏈式存儲,順序的還是比較簡單的

#include <stdio.h>
#include <stdlib.h>

//循環隊列最大數據元素個數
const int maxsize = 8; 

//循環隊列的結構體
typedef struct cycqueue{
    int *data;
    int front,rear;
} CycQue;


//隊列初始化
void init(CycQue *CQ){
    CQ->data = (int *)malloc(maxsize*sizeof(int));
    CQ->front = 0;
    CQ->rear = 0;
}


//判斷隊列是否爲空
int empty(CycQue *CQ){
    if(CQ->rear==CQ->front) return 1;
    else return 0;
}


//入隊列
int EnQueue(CycQue *CQ,int x){
    if((CQ->rear+1)%maxsize==CQ->front){
        printf("隊列滿");
        return 0;
    }
    else{
        CQ->rear =(CQ->rear+1) % maxsize;
        CQ->data[CQ->rear] = x;
        return 1;
    }
    
}

//出隊列
int OutQueue(CycQue *CQ){
    if(empty(CQ)){
        printf("隊列爲空");
        return 0;
    }
    else{
        CQ->front = (CQ->front+1) % maxsize;
        return 1;
        
    }
    
}

int main()
{
    CycQue CQ;
    init(&CQ);
    
    EnQueue(&CQ,2);
    EnQueue(&CQ,4);
    printf("%d",CQ.rear);
    OutQueue(&CQ);
    printf("%d",CQ.front);
    return 0;
}

鏈式隊列的C語言實現

鏈式隊列其實有之前的經驗之後,寫起來難度係數也不會太高,接下來我們編寫一個核心的部分代碼

隊列的鏈接實現實際上是用一個帶有頭結點的單鏈表來表示隊列,成爲鏈隊列
頭指針指向鏈表的頭結點
單鏈表的頭結點的next域指向隊列首結點
尾指針指向隊列尾結點,即單鏈表的最後一個結點

在這裏插入圖片描述
初始化

#include <stdio.h>
#include <stdlib.h>
typedef struct LinkQueueNode{
	int *data;
	struct LinkQueueNode *next;
} LkQueNode;

typedef struct LkQueue{
    LkQueNode *front,*rear;
} LkQue;


void init(LkQue *LQ){
    LkQueNode *temp;
    temp = (LkQueNode *)malloc(sizeof(LkQueNode)); //生成隊列的頭結點
    LQ->front = temp;    //隊列頭指針指向隊列頭結點
    LQ->rear = temp;     //隊列尾指針指向隊列尾結點
    (LQ->front)->next = NULL;
    
}

核心兩個操作入隊列出隊列

在這裏插入圖片描述
入隊列代碼如下

//入隊列
void EnQueue(LkQue *LQ,int x){
    
    LkQueNode *temp;
    temp = (LkQueNode *)malloc(sizeof(LkQueNode));
    temp->data = x;
    temp-next = NULL;
    (LQ->rear)->next = temp;
    LQ->rear = temp;
}

出隊列這個事情就交給你自己吧,好好理解一下,就可以寫出來了

自考要點

在考試中,隊列容易出現編碼題目,佔比在7~10分,所以還是蠻重要的呢!

看到這裏,辛苦啦,BYEBYE

在這裏插入圖片描述

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