C语言实现队列

1.概念
队列也是一种线性的数据结构,采用先进先出的方式来管理数据,存入(队尾)和取出(队首)在两个不同的端点进行,需要记录两个端点各自的位置

队列
2.实现思路
队列是一种逻辑概念,可以使用顺序结构来实现(顺序队列),也可以使用链式结构来实现(链式队列)
顺序队列需要记录头和尾,一般的顺序队列的队列空间只能使用一次,为了重复使用队列空间,顺序队列会被设计为环形队列(循环队列)
环形队列
环形队列理论上空和满都是队首和队尾重合,为了方便区分,强制定义当队尾在队首前一个位置时队列为满
链式队列可以用带尾结点的单链表来实现,以头结点作为队首,以尾结点作为队尾,入队相当于尾部插入,出队相当于头部删除
链式队列
3.设计环形队列结构体

typedef int T;
//环形队列结构
typedef struct{
    T data[N];//队列空间
    int head,tail;//队首 队尾
}sequeue_t,*queuelist_t;

C语言实现

  • 创建空队列
queuelist_t create_emptyqueue()
{
    queuelist_t sq = (queuelist_t)malloc(sizeof(sequeue_t));
    if(sq){
        //初始化队首和队尾
        sq->head = sq->tail = 0;
    }

    return sq;
}
  • 判空/判满
//判空 0---非空 1---空
int is_empty(queuelist_t sq)
{
    //队首队尾重合为空
    return sq->head==sq->tail;
}

//判满
int is_full(queuelist_t sq)
{
    //队尾在队首的前一个
    //队首在队尾的下一个位置
    return sq->head==(sq->tail+1)%N;
}
  • 入队
void queue_push(queuelist_t sq,T dt)
{
    //判满
    if(is_full(sq)){
        printf("queue is full!\n");
        return;
    }

    //入队
    sq->data[sq->tail] = dt;
    //tail移动到下一个位置
    sq->tail = (sq->tail+1)%N;
}
  • 出队
T queue_pop(queuelist_t sq)
{
    //判空
    if(is_empty(sq)){
        printf("sq is empty!\n");
        return -EEMPTY;
    }

    //出队
    T tmp = sq->data[sq->head];
    //head移动到下一个位置
    sq->head = (sq->head+1)%N;

    return tmp;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值