数据结构(严蔚敏)之五——循环队列(c语言实现)
生活随笔
收集整理的這篇文章主要介紹了
数据结构(严蔚敏)之五——循环队列(c语言实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在這里我先強調幾點概念:
1、在非空隊列中,頭指針始終指向隊列頭元素,而尾指針始終指向隊列尾元素的下一個位置。
2、在單隊列中我們判斷隊列是否為空的條件是:Q.front==Q.rear;而在循環隊列中只憑等式Q.front==Q.rear是無法判別隊列是“空”還是“滿”;可有兩種處理方法:其一是另設一個標志位一區別隊列是“空”還是“滿”;其二是少用一個元素空間,約定以“隊列頭指針在隊列尾指針的下一位置(置換的下一位置)上”作為隊列呈“滿”狀態的標志,即(Q.rear+1)%MAXQSIZE == Q.front.
隊列結構的實現:
#include <stdio.h> #include <malloc.h> typedef int QElemType; typedef int Status; #define MaxQSize 10 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -1 typedef struct {QElemType *base;int front, rear; }SqQueue; //初始化循環隊列 Status InitQueue(SqQueue &Q) {Q.base = (QElemType*)malloc(MaxQSize*sizeof(QElemType));if (Q.base == NULL){puts("分配內存空間失敗!"); exit(OVERFLOW);}Q.front = Q.rear = 0;return 0; } //將循環隊列清空 Status ClearQueue(SqQueue &Q) {Q.front = Q.rear = 0; } //求隊列元素的個數 Status QueueLength(SqQueue Q) {return (Q.rear - Q.front + MaxQSize) % MaxQSize; } //插入元素到循環隊列 Status EnSqQueue(SqQueue &Q, QElemType e) {if ((Q.rear + 1) % MaxQSize == Q.front){puts("隊列已滿!"); return ERROR; /*隊列滿*/}Q.base[Q.rear] = e; //元素e入隊Q.rear = (Q.rear + 1) % MaxQSize; //修改隊尾指針return OK; } //從循環隊列中刪除元素 Status DeSqQueue(SqQueue &Q, QElemType &e) {if (Q.front == Q.rear)return ERROR;e = Q.base[Q.front]; //取隊頭元素至eQ.front = (Q.front + 1) % MaxQSize; //修改隊頭指針,如果超內存,循環 return OK; } //判斷一個循環隊列是否為空隊列 Status isQueueEmpty(SqQueue Q) {if (Q.front == Q.rear)return TRUE;elsereturn FALSE; }測試代碼:
int main() {int i, e;SqQueue Q;InitQueue(Q);for (i=0; i<MaxQSize; i++) //只有MaxQSize個數據進隊列EnSqQueue(Q, i);i = QueueLength(Q);printf("隊列里的元素有%d個\n", i);for (i=0; i<3; i++){DeSqQueue(Q, e);printf("%d ", e);}printf("\n");i = QueueLength(Q);printf("隊列里的元素有%d個\n", i);for (i=10; i<12; i++)EnSqQueue(Q, i);i = QueueLength(Q);printf("隊列里的元素有%d個\n", i);ClearQueue(Q);i = QueueLength(Q);printf("隊列里的元素有%d個\n", i);return 0; }運行結果:
總結
以上是生活随笔為你收集整理的数据结构(严蔚敏)之五——循环队列(c语言实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DevOps是什么意思
- 下一篇: 爱奇艺程序员落户北京后离职被判赔 10