《資料結構》嚴蔚敏 順序儲存實現迴圈佇列 演算法3_4_3
阿新 • • 發佈:2019-01-12
我第一次實現的時候竟然是用連結串列實現的。。。哎,這種zz的事,就莫再提了,轉載文章:https://blog.csdn.net/Vit_rose/article/details/52781124
其實和前面順序棧差不多,但是就是在判斷指標的下一個位置的時候
q->rear = (q->rear+1)%MAXQSIZE;
q->front = (q->front+1)%MAXQSIZE;
判斷佇列的長度的時候:
return (q.rear-q.front+MAXQSIZE)%MAXQSIZE;
//順序實現佇列 //若長度無法估計宜使用鏈佇列 //用連結串列來實現 //使用方法二,當隊頭指標在隊尾指標下一個位置時才判斷佇列為滿 #include<stdio.h> #include<stdlib.h> #define ERROR 0 #define OK 1 #define FALSE 0 #define TRUE 1 #define INFEASIBLE -1 #define OVERFLOW -2 #define MAXQSIZE 100 typedef int QElemType; typedef int Status; typedef struct { QElemType *base; int front; int rear; }Squeue; Status InitQueue(Squeue *q) { q->base = (QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!q->base) exit(OVERFLOW); q->front = q->rear = 0; return OK; } int QueueLength(Squeue q) { return (q.rear-q.front+MAXQSIZE)%MAXQSIZE; } Status EnQueue(Squeue *q,QElemType e) { if( (q->rear+1) %MAXQSIZE == q->front ) return ERROR; q->base[q->rear] = e; q->rear = (q->rear+1)%MAXQSIZE; return OK; } Status DeQueue(Squeue *q,QElemType *e) { if(q->front == q->rear) return ERROR; *e = q->base[q->front]; q->front = (q->front+1)%MAXQSIZE; return OK; } Status TraverseQueue(Squeue q) { if(q.front == q.rear){ printf("佇列為空\n"); return ERROR; } int i = q.front; while(i%MAXQSIZE != q.rear) printf("%d ",q.base[i++]); printf("\n"); return OK; } int main() { Squeue q; QElemType e; printf("初始化一個空佇列:\n"); InitQueue(&q); TraverseQueue(q); printf("\n構造佇列 1...10 :\n"); int i; for(i = 1;i<=10;++i) EnQueue(&q,i); TraverseQueue(q); printf("\n在佇列尾插入元素 13 :\n"); EnQueue(&q,13); TraverseQueue(q); printf("\n刪除隊頭元素,用e返回該刪除值:\n"); DeQueue(&q,&e); TraverseQueue(q); printf("被刪除的元素 e = %d\n",e); return 0; }