第七週--專案1建立環形佇列演算法庫
阿新 • • 發佈:2019-01-28
*
* Copyright (c++) 2015 煙臺大學計算機學院
* All right reserved.
* 檔名稱:huan.cpp
* 作 者: 商文軻
* 完成日期:2015年10月日
* 版 本 號:v1.9
*
*問題描述:建立環形佇列演算法庫
*
sqqueue.h
#ifndef SQQUEUE_H_INCLUDED #define SQQUEUE_H_INCLUDED #include <stdio.h> #include <malloc.h> #define MaxSize 5 typedef char ElemType; typedef struct { ElemType data[MaxSize]; int front,rear; /*隊首和隊尾指標*/ } SqQueue; void InitQueue(SqQueue *&q); //初始化順序環形佇列 void DestroyQueue(SqQueue *&q); //銷燬順序環形佇列 bool QueueEmpty(SqQueue *q); //判斷順序環形佇列是否為空 int QueueLength(SqQueue *q); //返回佇列中元素個數,也稱佇列長度 bool enQueue(SqQueue *&q,ElemType e); //進隊 bool deQueue(SqQueue *&q,ElemType &e); //出隊 #endif // SQQUEUE_H_INCLUDED
sqqueue.cpp
#include "sqqueue.h" void InitQueue(SqQueue *&q) //初始化順序環形佇列 { q=(SqQueue *)malloc (sizeof(SqQueue)); q->front=q->rear=0; //隊首隊尾指標相等 佇列為空 } void DestroyQueue(SqQueue *&q) //銷燬順序環形佇列 { free(q); } bool QueueEmpty(SqQueue *q) //判斷順序環形佇列是否為空 { return(q->front==q->rear); } int QueueLength(SqQueue *q) //返回佇列中元素個數,也稱佇列長度 { return (q->rear-q->front+MaxSize)%MaxSize; } bool enQueue(SqQueue *&q,ElemType e) //進隊 { if ((q->rear+1)%MaxSize==q->front) //隊滿上溢位 return false; q->rear=(q->rear+1)%MaxSize; //隊尾指標後移 q->data[q->rear]=e; return true; } bool deQueue(SqQueue *&q,ElemType &e) //出隊 { if (q->front==q->rear) //隊空下溢位 return false; q->front=(q->front+1)%MaxSize; //隊首插入 e=q->data[q->front]; return true; }
main.pp
#include <stdio.h> #include "sqqueue.h" int main() { ElemType e; SqQueue *q; printf("(1)初始化佇列q\n"); InitQueue(q); printf("(2)依次進佇列元素a,b,c\n"); if (enQueue(q,'a')==0) printf("隊滿,不能進隊\n"); if (enQueue(q,'b')==0) printf("隊滿,不能進隊\n"); if (enQueue(q,'c')==0) printf("隊滿,不能進隊\n"); printf("(3)佇列為%s\n",(QueueEmpty(q)?"空":"非空")); if (deQueue(q,e)==0) printf("隊空,不能出隊\n"); else printf("(4)出隊一個元素%c\n",e); printf("(5)佇列q的元素個數:%d\n",QueueLength(q)); printf("(6)依次進佇列元素d,e,f\n"); if (enQueue(q,'d')==0) printf("隊滿,不能進隊\n"); if (enQueue(q,'e')==0) printf("隊滿,不能進隊\n"); if (enQueue(q,'f')==0) printf("隊滿,不能進隊\n"); printf("(7)佇列q的元素個數:%d\n",QueueLength(q)); printf("(8)出佇列序列:"); while (!QueueEmpty(q)) { deQueue(q,e); printf("%c ",e); } printf("\n"); printf("(9)釋放佇列\n"); DestroyQueue(q); return 0; }
總結:環形佇列仍具有佇列的特徵,隊尾進,隊首出,首尾相等隊為空。插入和刪除時的求餘體現了環形佇列迴圈,在紙上畫出後更容易理解演算法語句。
老師的主函式充分體現了測試功能,要多多借鑑多多嘗試。