日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

循环队列的介绍与实现

發(fā)布時間:2024/7/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 循环队列的介绍与实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

        • 1 循環(huán)隊(duì)列定義
        • 2 循環(huán)隊(duì)列基本操作
        • 3 循環(huán)隊(duì)列代碼實(shí)現(xiàn)
        • 4 補(bǔ)充

1 循環(huán)隊(duì)列定義

循環(huán)隊(duì)列:即順序存儲的隊(duì)列,是為了避免“假溢出”而利用%運(yùn)算符將隊(duì)列首尾相接連成一個環(huán)狀的隊(duì)列,稱為循環(huán)隊(duì)列。

引入循環(huán)隊(duì)列克服順序隊(duì)列中存在的“假上溢”現(xiàn)象。

假上溢:

因?yàn)樵谌腙?duì)和出隊(duì)操作中,頭尾指針只增加不減小,致使被刪元素的空間永遠(yuǎn)無法重新利用。因此,盡管隊(duì)列中實(shí)際的元素個數(shù)遠(yuǎn)遠(yuǎn)小于向量空間的規(guī)模,但也可能由于尾指針已超越向量空間的上界而不能做入隊(duì)操作。該現(xiàn)象稱為“假上溢”。
簡而言之就是數(shù)組中有空位置卻不能再做入隊(duì),出隊(duì)操作

2 循環(huán)隊(duì)列基本操作

  • 隊(duì)空與隊(duì)滿
    為什么要分析隊(duì)空隊(duì)滿的條件?
  • 循環(huán)隊(duì)列是順序存儲的隊(duì)列,而順序隊(duì)列在做入隊(duì)時要先判斷隊(duì)列是否已滿,即是否已經(jīng)用完預(yù)分配的空間,出隊(duì)時要判斷隊(duì)列是否已空。


    約定:

    front指向隊(duì)列中實(shí)際頭元素的位置
    rear 指向隊(duì)列中實(shí)際尾元素的后一位置

  • 入隊(duì)
  • rear=(rear+1%MAXSIZE queue[rear]=x
  • 出隊(duì)
  • front=(front+1%MAXSIZE x=queue[front]
  • 隊(duì)空:front==rear
  • 隊(duì)滿:front==(rear+1)% MAXSIZE
  • 3 循環(huán)隊(duì)列代碼實(shí)現(xiàn)

    #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAXSZIE (20)typedef int ElementType; typedef struct SqQueue {ElementType data[MAXSZIE];int front;int rear; } *Queue;Queue InitQueue(void) {Queue Q = (Queue)malloc(sizeof(struct SqQueue));Q->front = 0;Q->rear = 0;return Q; }int IsEmpty(Queue Q) {return Q->front == Q->rear; }int IsFull(Queue Q) {return (Q->rear + 1) % MAXSZIE == Q->front; }void EnQueue(Queue Q, ElementType e) {if (IsFull(Q)) {return;}Q->data[Q->rear] = e;Q->rear = (Q->rear + 1) % MAXSZIE; }void DeQueue(Queue Q, ElementType *e) {if (IsEmpty(Q)) {return;}*e = Q->data[Q->front];Q->front = (Q->front + 1) % MAXSZIE; }int main(void) {ElementType e;Queue Q = InitQueue();srand((unsigned)time(NULL));for (int i = 0; i < 10; i++) {e = rand() % 100;EnQueue(Q, e);}while (!IsEmpty(Q)) {DeQueue(Q, &e);printf("%d ", e);} }

    4 補(bǔ)充

  • 為什么要設(shè)計(jì)堆棧?它有什么獨(dú)特用途?
  • ① 調(diào)用函數(shù)或子程序非它莫屬;
    ② 遞歸運(yùn)算的有力工具;
    ③ 用于保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場;
    ④ 簡化了程序設(shè)計(jì)的問題。

  • 為什么要設(shè)計(jì)隊(duì)列?它有什么獨(dú)特用途?
  • ① 離散事件的模擬(模擬事件發(fā)生的先后順序,例如 CPU芯片中的指令譯碼隊(duì)列);
    ② 操作系統(tǒng)中的作業(yè)調(diào)度(一個CPU執(zhí)行多個作業(yè));
    ③ 簡化程序設(shè)計(jì)。

  • 什么叫“假溢出” ?如何解決?
  • 答:在順序隊(duì)中,當(dāng)尾指針已經(jīng)到了數(shù)組的上界,不能再有入隊(duì)操作,但其實(shí)數(shù)組中還有空位置,這就叫“假溢出”。
    解決假溢出的途徑———采用循環(huán)隊(duì)列。

  • 線性表、棧、隊(duì)的異同點(diǎn):
  • 相同點(diǎn)

    邏輯結(jié)構(gòu)相同,都是線性的;都可以用順序存儲或鏈表存儲;棧和隊(duì)列是兩種特殊的線性表,即受限的線性表(只是對插入、刪除運(yùn)算加以限制)。

    不同點(diǎn)

    ① 運(yùn)算規(guī)則不同:線性表為隨機(jī)存取;
    而棧是只允許在一端進(jìn)行插入和刪除運(yùn)算,因而是后進(jìn)先出表LIFO;
    隊(duì)列是只允許在一端進(jìn)行插入、另一端進(jìn)行刪除運(yùn)算,因而是先進(jìn)先出表FIFO。
    ② 用途不同:線性表比較通用;堆棧用于函數(shù)調(diào)用、遞歸和簡化設(shè)計(jì)等;隊(duì)列用于離散事件模擬、OS作業(yè)調(diào)度和簡化設(shè)計(jì)等。

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

    總結(jié)

    以上是生活随笔為你收集整理的循环队列的介绍与实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。