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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

循环队列的顺序存储和实现(C语言)【循环队列】

發(fā)布時(shí)間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 循环队列的顺序存储和实现(C语言)【循环队列】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  • 循環(huán)隊(duì)列-隊(duì)列的順序表示和實(shí)現(xiàn)
    • 循環(huán)隊(duì)列的三種狀態(tài)
  • 循環(huán)隊(duì)列-隊(duì)列的順序?qū)崿F(xiàn) (代碼演示)
    • CycleQueue.h
    • CycleQueue.cpp
    • main.cpp
    • 測(cè)試結(jié)果

循環(huán)隊(duì)列-隊(duì)列的順序表示和實(shí)現(xiàn)

是限制僅在表頭刪除和表尾插入的順序表。
利用一組地址連續(xù)的存儲(chǔ)單元依次存放隊(duì)列中的數(shù)據(jù)元素。
因?yàn)?#xff1a;隊(duì)頭和隊(duì)尾的位置是變化的,所以:設(shè)頭、尾指針。


在順序隊(duì)列中,當(dāng)尾指針已經(jīng)指向了隊(duì)列的最后一個(gè)位置的下一位置時(shí),若再有元素入隊(duì),就會(huì)發(fā)生“溢出”。

“假溢出”——隊(duì)列的存儲(chǔ)空間未滿,卻發(fā)生了溢出。

解決“假溢出”的問(wèn)題有兩種可行的方法:
(1)、平移元素:把元素平移到隊(duì)列的首部。效率低。
(2)、將新元素插入到第一個(gè)位置上,構(gòu)成循環(huán)隊(duì)列, 入隊(duì)和出隊(duì)仍按“先進(jìn)先出”的原則進(jìn)行。 操作效率、空間利用率高。

循環(huán)隊(duì)列的三種狀態(tài)


解決辦法:
(1)、另設(shè)一個(gè)布爾變量以區(qū)別隊(duì)列的空和滿(使用一個(gè)計(jì)數(shù)器記錄隊(duì)列中元素的總數(shù)。);

(2)、少用一個(gè)元素的空間,約定入隊(duì)前測(cè)試尾指針在循環(huán)意義下加 1 后是否等于頭指針,若相等則認(rèn)為隊(duì)滿;

循環(huán)隊(duì)列-隊(duì)列的順序?qū)崿F(xiàn) (代碼演示)

CycleQueue.h

#pragma once#define MAXQSIZE 100 //最大隊(duì)列長(zhǎng)度 typedef int QElemType; //定義數(shù)據(jù)類型typedef struct {QElemType* base; // 預(yù)分配存儲(chǔ)空間基址 int front; // 頭指針,若隊(duì)列不空, // 指向隊(duì)列頭元素 int rear; // 尾指針,若隊(duì)列不空, // 指向隊(duì)列尾元素 的下一個(gè)位置 } SqQueue;void InitCycleQueue(SqQueue* Q);//初始化循環(huán)隊(duì)列 void DestroyCycleQueue(SqQueue* Q); //銷毀循環(huán)隊(duì)列 int LengthCycleQueue(SqQueue Q); //求循環(huán)隊(duì)列的長(zhǎng)度 bool InputCycleQueue(SqQueue* Q, QElemType val); //入循環(huán)隊(duì)列 bool OutputCycleQueue(SqQueue* Q, QElemType * val); //出循環(huán)隊(duì)列 void Show(SqQueue Q); //打印循環(huán)隊(duì)列的元素

CycleQueue.cpp

#include "CycleQueue.h" #include <malloc.h> #include <stdlib.h> #include <stdio.h>void InitCycleQueue(SqQueue* Q) {Q->base = (QElemType*)malloc(MAXQSIZE * sizeof(QElemType));if (!Q->base){printf("InitQueue file\n");exit(-1);}Q->front = Q->rear = 0; }void DestroyCycleQueue(SqQueue* Q) //銷毀循環(huán)隊(duì)列 {free(Q->base); }int LengthCycleQueue(SqQueue Q) //求循環(huán)隊(duì)列的長(zhǎng)度 {return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE; }bool InputCycleQueue(SqQueue* Q, QElemType val)//入循環(huán)隊(duì)列 {if ((Q->rear + 1) % MAXQSIZE == Q->front)return false;Q->base[Q->rear] = val;Q->rear = (Q->rear + 1) % MAXQSIZE;return true; }bool OutputCycleQueue(SqQueue* Q, QElemType* val) //出循環(huán)隊(duì)列 {if(Q->rear == Q->front)return false;*val = Q->base[Q->front];Q->front = (Q->front + 1) % MAXQSIZE;return true; }void Show(SqQueue Q)//打印循環(huán)隊(duì)列的元素 {while (Q.front % MAXQSIZE != Q.rear)printf("%d\t", Q.base[Q.front++]);printf("\n"); }

main.cpp

#include "CycleQueue.h" #include <stdio.h> int main() {SqQueue Q;InitCycleQueue(&Q);printf("入循環(huán)隊(duì)列:\n");for (int i = 0; i < 10; i++)InputCycleQueue(&Q, i * 11);Show(Q);QElemType tmp;printf("出循環(huán)隊(duì)列:\n");OutputCycleQueue(&Q, &tmp);Show(Q);printf("出循環(huán)隊(duì)列:\n");OutputCycleQueue(&Q, &tmp);Show(Q);printf("循環(huán)隊(duì)列長(zhǎng)度為%d\n", LengthCycleQueue(Q));DestroyCycleQueue(&Q);return 0; }

測(cè)試結(jié)果

總結(jié)

以上是生活随笔為你收集整理的循环队列的顺序存储和实现(C语言)【循环队列】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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