C语言数据结构-顺序队列

来源:互联网 发布:2017淘宝食品新规 编辑:程序博客网 时间:2024/04/28 21:06

顺序队列

顺序队列与顺序表相似,只不过其具有队列的运算规则。数据只能从队尾进,对头出,为先进先出方式。
分别用两个数来表示队头front和队尾rear的位置,其只能向前增加,不能退后,这样容易溢出且浪费空间,因此一般用循环队列来表示,及队列空间的首尾相连的,当达到队尾时可以跳转到最开始位置。
下面为顺序队列和循环队列的结构图:

这里写图片描述

这里写图片描述

循环队列一般用一个额外的数来表示队满或队空,或者空一个元素,用来测试尾指针加1是否等于头指针。

下面利用第一种方式实现队列及其相关运算:

#include <stdio.h>#define QueueSize 20//typedef int DataType ;#define DataType inttypedef struct {    DataType data[QueueSize];    int front;    int rear;    int count;}Queue;//初始化队列void InitQueue(Queue *Q){    Q->front = 0;    Q->rear = 0;    Q->count = 0;}//队列是否为空int QueueEmpty(Queue *Q){    return (Q->count == 0);}//队列是否满int QueueFull(Queue *Q){    return (Q->count == QueueSize);}//入队void EnQueue(Queue *Q, DataType v){    if(QueueFull(Q))        printf("Error, the queue is full!");    Q->data[Q->rear] = v;    Q->rear = (Q->rear+1)%QueueSize; //循环,防止rear大于QueueSize;    Q->count++;}//出队DataType DeQueue(Queue *Q){    DataType i;    if(QueueEmpty(Q))        printf("Error, the queue is empty");    i = Q->data[Q->front];    Q->front = (Q->front+1)%QueueSize; //循环    Q->count--;    return i;}//读队头元素,不改变对状态DataType ReadQueue(Queue *Q){    DataType i;    if(QueueEmpty(Q))        printf("Error, the queue is empty");    i = Q->data[Q->front];    return i;}int main(){    Queue Q, *Q1;    int i = 1;    InitQueue(&Q);    while(i<=6)    {        EnQueue(&Q,i);        i++;    }    printf("DeQueue: %d\n", DeQueue(&Q));    printf("DeQueue: %d\n", DeQueue(&Q));    printf("DeQueue: %d\n", ReadQueue(&Q));    EnQueue(&Q,9);    printf("The queue :");    while(!QueueEmpty(&Q))        printf("%d\t",DeQueue(&Q));    Q1 = &Q;    printf("\nThe length of the queue: %d", Q1->count);    return 0;}

测试结果为:
DeQueue:1
DeQueue:2
DeQueue:3
The queue: 3 4 5 6 9
The length of the queue : 0

0 0
原创粉丝点击