循环队列的顺序存储和实现(C语言)【循环队列】
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                循环队列的顺序存储和实现(C语言)【循环队列】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                - 循環隊列-隊列的順序表示和實現
 - 循環隊列的三種狀態
 
- 循環隊列-隊列的順序實現 (代碼演示)
 - CycleQueue.h
 - CycleQueue.cpp
 - main.cpp
 - 測試結果
 
循環隊列-隊列的順序表示和實現
是限制僅在表頭刪除和表尾插入的順序表。
 利用一組地址連續的存儲單元依次存放隊列中的數據元素。
 因為:隊頭和隊尾的位置是變化的,所以:設頭、尾指針。
 
在順序隊列中,當尾指針已經指向了隊列的最后一個位置的下一位置時,若再有元素入隊,就會發生“溢出”。
 
“假溢出”——隊列的存儲空間未滿,卻發生了溢出。
解決“假溢出”的問題有兩種可行的方法:
 (1)、平移元素:把元素平移到隊列的首部。效率低。
 (2)、將新元素插入到第一個位置上,構成循環隊列, 入隊和出隊仍按“先進先出”的原則進行。 操作效率、空間利用率高。
 
循環隊列的三種狀態
 解決辦法:
 (1)、另設一個布爾變量以區別隊列的空和滿(使用一個計數器記錄隊列中元素的總數。);
(2)、少用一個元素的空間,約定入隊前測試尾指針在循環意義下加 1 后是否等于頭指針,若相等則認為隊滿;
循環隊列-隊列的順序實現 (代碼演示)
CycleQueue.h
#pragma once#define MAXQSIZE 100 //最大隊列長度 typedef int QElemType; //定義數據類型typedef struct {QElemType* base; // 預分配存儲空間基址 int front; // 頭指針,若隊列不空, // 指向隊列頭元素 int rear; // 尾指針,若隊列不空, // 指向隊列尾元素 的下一個位置 } SqQueue;void InitCycleQueue(SqQueue* Q);//初始化循環隊列 void DestroyCycleQueue(SqQueue* Q); //銷毀循環隊列 int LengthCycleQueue(SqQueue Q); //求循環隊列的長度 bool InputCycleQueue(SqQueue* Q, QElemType val); //入循環隊列 bool OutputCycleQueue(SqQueue* Q, QElemType * val); //出循環隊列 void Show(SqQueue Q); //打印循環隊列的元素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) //銷毀循環隊列 {free(Q->base); }int LengthCycleQueue(SqQueue Q) //求循環隊列的長度 {return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE; }bool InputCycleQueue(SqQueue* Q, QElemType val)//入循環隊列 {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) //出循環隊列 {if(Q->rear == Q->front)return false;*val = Q->base[Q->front];Q->front = (Q->front + 1) % MAXQSIZE;return true; }void Show(SqQueue Q)//打印循環隊列的元素 {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("入循環隊列:\n");for (int i = 0; i < 10; i++)InputCycleQueue(&Q, i * 11);Show(Q);QElemType tmp;printf("出循環隊列:\n");OutputCycleQueue(&Q, &tmp);Show(Q);printf("出循環隊列:\n");OutputCycleQueue(&Q, &tmp);Show(Q);printf("循環隊列長度為%d\n", LengthCycleQueue(Q));DestroyCycleQueue(&Q);return 0; }測試結果
總結
以上是生活随笔為你收集整理的循环队列的顺序存储和实现(C语言)【循环队列】的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 朴素的串模式匹配(C语言实现)【串模式匹
 - 下一篇: 队列的链式存储和实现(C语言)【队列】(