說明:
時間關係,這裏只給出代碼及註釋,有空的時候再詳細介紹一下代碼的實現流程。
1.代碼及註釋
如下:
#include<stdio.h> #include<stdlib.h> typedef char ElemType; typedef struct { ElemType *elem; // 存儲空間的基址 int front; // 隊頭位標 int rear; // 隊尾位標,指示隊尾元素的下一位置 int maxSize; // 最大長度 } SqQueue; #define OVERFLOW -1 #define OK 1 #define ERROR 0 #define TRUE 2 #define FALSE -2 typedef int Status; Status InitQueue_Sq(SqQueue &Q, int size) { // 構造一個空隊列 Q.elem = (ElemType *)malloc(size*sizeof(ElemType)); Q.maxSize = size; Q.front = Q.rear = 0; return OK; } Status QueueEmpty_Sq(SqQueue Q){ // 判斷隊列Q是否空,若空則返回TRUE,否則FALSE if(Q.front == Q.rear) return TRUE; else return FALSE; } Status EnQueue_Sq(SqQueue &Q, ElemType e) { // 若當前隊列不滿,在隊列的尾元素之後,插入元素 e 爲新的隊列尾元素 if(Q.front == (Q.rear + 1)%Q.maxSize) return ERROR; Q.elem[Q.rear] = e; Q.rear = (Q.rear + 1)%Q.maxSize; return OK; } Status DeQueue_Sq(SqQueue &Q, ElemType &e) { // 若隊列不空,則刪除隊列Q中的頭元素,用 e 返回其值 if(Q.front == Q.rear) return ERROR; // 隊空報錯 e = Q.elem[Q.front]; Q.front = (Q.front+1)%Q.maxSize; // Q.front循環加1 return OK; } int main(void) { SqQueue Q; ElemType e; Status result1, result2; //1. 初始化一個size爲5的循環隊列Q InitQueue_Sq(Q, 5); EnQueue_Sq(Q, 'A'); EnQueue_Sq(Q, 'B'); EnQueue_Sq(Q, 'C'); EnQueue_Sq(Q, 'D'); DeQueue_Sq(Q, e); EnQueue_Sq(Q, 'E'); DeQueue_Sq(Q, e); EnQueue_Sq(Q, 'F'); //出現了要用求餘確定來確定新進隊列的元素位置, //即“循環使用空間的情況” result1 = EnQueue_Sq(Q, 'G'); //滿了,放不下 printf("result1 = %d\n", result1); DeQueue_Sq(Q, e); DeQueue_Sq(Q, e); DeQueue_Sq(Q, e); DeQueue_Sq(Q, e); result2 = DeQueue_Sq(Q, e); //空了,return FALSE printf("result2 = %d\n", result2); }
2.執行結果
如下:
result1 = 0 result2 = 0 請按任意鍵繼續. . .
3.研究方法
第2步只是直接給出結果,實際上利用編譯器的斷點功能可以觀察每一步的執行情況,從而加深對循環隊列的理解,可以嘗試一下。