循环队列的顺序存储和实现(C语言)【循环队列】
- 循環(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)題。
- 上一篇: 朴素的串模式匹配(C语言实现)【串模式匹
- 下一篇: 队列的链式存储和实现(C语言)【队列】(