1. 程式人生 > >《資料結構》嚴蔚敏 順序儲存實現迴圈佇列 演算法3_4_3

《資料結構》嚴蔚敏 順序儲存實現迴圈佇列 演算法3_4_3

我第一次實現的時候竟然是用連結串列實現的。。。哎,這種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;
}