欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言实现队列

程序员文章站 2022-03-10 19:55:08
...

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

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