NOJ数据结构009——循环队列

本文详细介绍如何使用域变量优化循环队列的创建、判空、判满以及入队和出队操作。通过实例展示了循环队列在节省空间方面的优势,并提供了关键函数的代码实现和一个完整应用案例。

在这里插入图片描述在这里插入图片描述
本题考查循环队列的应用。
循环队列是队列的一种顺序表示和实现方法。可节省大量空间。
本题中要求使用域变量rear(即队尾)和length(即队长)编写程序。这样做可规避一般循环队列的小缺陷,即不用预留一个空间来判断是否队满。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int *data;
    int rear;
    int length;
    int n;
}QueueNode;

QueueNode seq;

int IsEmpty(QueueNode *q);          //队列判空
int IsFull(QueueNode *q);           //队列判满
void Push(QueueNode *q, int item);  //入队
void Pull(QueueNode *q, int* out);  //出队
void PrintQueue(QueueNode *q);      //输出队列元素及队首

QueueNode CreateQueue(int m);

int main()
{
    int m;
    scanf("%d", &m);
    seq = CreateQueue(m);
    while(1) {
        int tmp;
        scanf("%d", &tmp);
        Push(&seq, tmp);
        char c;
        c = getchar();
        if (c == '\n') {
            break;
        }
    }
    char str[5];
    scanf("%s", str);
    int out, out_tmp;
    scanf("%d", &out);
    Pull(&seq, &out_tmp);
    while(out != out_tmp) {
        Pull(&seq, &out_tmp);
    }
    PrintQueue(&seq);
    return 0;
}

QueueNode CreateQueue(int m)
{
    QueueNode *q;
    q = (QueueNode*) malloc (sizeof(QueueNode));
    q->data = (int*) malloc (sizeof(int)*m);
    q->rear = 0;
    q->length = 0;
    q->n = m;
    return *q;
}

int IsEmpty(QueueNode *q)
{      //队列判空
    if(q->length == 0) {
        return 1;
    }
    else return 0;
}

int IsFull(QueueNode *q)
{      //队列判满
    if(q->length == q->n) {
        return 1;
    }
    else return 0;
}

void Push(QueueNode *q, int item)
{       //入队
    if(IsEmpty(q)) {
        q->length++;
        q->data[q->rear] = item;
        return;
    }
    if(IsFull(q)) {
        return;
    }
    else {
        q->length++;
        q->rear = (q->rear + 1) % q->n;
        q->data[q->rear] = item;
    }
}

void Pull(QueueNode *q, int* out)
{     //出队
    if(IsEmpty(q)) {
        return;
    }
    int tmp;
    tmp = (q->rear + q->n  - q->length + 1) % q->n;//队首所在
    *out = q->data[tmp];
    q->length--;
}

void PrintQueue(QueueNode *q)
{    //输出队列元素及队首
    if(IsEmpty(q)) {
        return;
    }
    int tmp;
    tmp = (q->rear + q->n - q->length + 1) % q->n;
    while (tmp != q->rear) {
        printf("%d ", q->data[tmp]);
        tmp = (tmp + 1) % q->n;
    }
    printf("%d ", q->data[tmp]);
    tmp = (q->rear + q->n - q->length + 1) % q->n;
    printf("\n%d ", q->data[tmp]);
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值