数据结构——顺序队列


前言

Queue(队列)

队列是一种操作受限的线性表,它只允许在一端插入加元素,在另一端删除元素。允许插入的一端称为队尾,允许删除的一端称为队头。
队列的操作具有先进先出(FIFO)的特点。队列的基本运算有置空队列、判对空、入队列、出队列、取队头五种。

提示:以下是本篇文章正文内容,下面案例可供参考

一、顺序队列为什么要采用循环的方式??

顺序队列采用循环的方式可以充分利用数组空间,避免数据超出的操作,提高了队列的效率

二、循环队列如何判断空和满?

判断队空:循环队列为空的条件是front等于rear 当front等于rear时,表示队列中没有元素,即队列为空
判断队满:循环队列为满的条件是front等于(rear+1) % N 当front等于(rear+1) % N 时,表示队列中的元素已经填满了整个队列,即队列为满

三、写出顺序队列;

1.创建顺序队列

代码如下(示例):

typedef int datatype;
#define N 128
 
typedef struct {
    datatype data[N];
    int front;
    int rear;
}sequeue;
 
sequeue * queue_create();
int enqueue(sequeue *sq, datatype x);
datatype dequeue(sequeue *sq);
int queue_empty(sequeue *sq);
int queue_full(sequeue *sq); 
int queue_clear(sequeue *sq);
sequeue * queue_free(sequeue *sq);

2.实现顺序队列各个功能的代码块

代码如下(示例):

sequeue * queue_create() {
    sequeue *sq;
 
    if ((sq = (sequeue *)malloc(sizeof(sequeue))) == NULL) {
        printf("malloc failed\n");
        return NULL;
    }
 
    memset(sq->data, 0, sizeof(sq->data));
    sq->front = sq->rear = 0;
    return sq;
}
 
int enqueue(sequeue *sq, datatype x) {
    if (sq == NULL) {
        printf("sq is NULL\n");
        return -1;
    }
 
    if ((sq->rear + 1) % N == sq->front) {
        printf("sequeue is full\n");
        return -1;
    }
 
    sq->data[sq->rear] = x;
    sq->rear = (sq->rear + 1) % N;
 
    return  0;
}
 
datatype dequeue(sequeue *sq) {
    datatype ret;
 
    ret = sq->data[sq->front];
 
    sq->front = (sq->front + 1) % N;
 
    return ret;
}
 
int queue_empty(sequeue *sq) {
    if (sq == NULL) {
        printf("sq is NULL\n");
        return -1;
    }
 
    return (sq->front == sq->rear ? 1 : 0);
}
 
int queue_full(sequeue *sq) {
    if (sq == NULL) {
        printf("sq is NULL\n");
        return -1;
    }
 
    if ((sq->rear + 1) % N == sq->front) {
        return 1;
    }
    else {
        return 0;
    }
}
 
int queue_clear(sequeue *sq) {
    if (sq == NULL) {
        printf("sq is NULL\n");
        return -1;
    }
 
    sq->front = sq->rear = 0;
 
    return 0;
}
 
sequeue * queue_free(sequeue *sq) {
    if (sq == NULL) {
        printf("sq is NULL\n");
        return NULL;
    }
 
    free(sq);
    sq = NULL;
 
    return NULL;
}

3.测试顺序队列

int main(int argc, const char *argv[])
{
    sequeue *sq;
 
    if ((sq = queue_create()) == NULL) {
        return -1;
    }
     
    enqueue(sq, 10);
    enqueue(sq, 100);
    enqueue(sq, 1000);
 
    while (!queue_empty(sq)) {
        printf("dequeue:%d\n", dequeue(sq));
    }
 
    queue_free(sq);
 
    return 0;
}
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值