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

顺序队列

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

C语言数据结构-顺序队列_第1张图片

C语言数据结构-顺序队列_第2张图片

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

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

#include <stdio.h>

#define QueueSize 20
//typedef int DataType ;
#define DataType int
typedef 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

你可能感兴趣的:(数据结构,C语言)