队列

队列是一种特殊的线性表,只允许在表的前端front进行删除操作,在表的后端rear进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,今次那个删除操作的端称为队头。

基本特征:先进先出(FIFO)

基本操作:压入,弹出

实现要点:初始化空间,前指针front弹出后指针rear压入,循环使用,判空判满

举例1:基于数组的队列

//队列
typedef struct Queue{
    int *array;
    size_t cap;
    size_t front;
    size_t rear;
    size_t size;
} Myqueue;

//分配内存并初始化为空队列
void queueInit(Myqueue *queue,size_t cap){
    queue->array = malloc(cap *sizeof(int));
    queue->cap = cap;
    queue->front = 0;
    queue->rear = 0;
    queue->size = 0;
}
//释放内存并恢复到初始状态
void queueDestroy(Myqueue *queue){
    free(queue->array);
    queue->array = NULL;
    queue->cap = 0;
    queue->front = 0;
    queue->rear = 0;
    queue->size = 0;
}
//判满
int queueFull(Myqueue *queue){
    return queue->size >= queue->cap;
}
//判空
int queueEmpty(Myqueue *queue){
    return ! queue->size;
}
//压入
void queuePush(Myqueue *queue,int data){
    if (queue->rear >= queue->cap) {
        queue->rear = 0;
    }
    ++ queue->size;
    queue->array[queue->rear ++] = data;
}
//弹出
int queuePop(Myqueue *queue){
    if (queue->front >= queue->cap) {
        queue->front = 0;
    }
    -- queue->size;
    return queue->array[queue->front ++];
}
//队首
int queueFront(Myqueue *queue){
    if (queue->front >= queue->cap) {
        queue->front = 0;
    }
    return queue->array[queue->front];
}
//数量
size_t queueSize(Myqueue *queue){
    return queue->size;
}

int main(){
    Myqueue *queue;
    queueInit(queue, 4);
    queuePush(queue, 50);
    queuePush(queue, 60);
    queuePush(queue, 70);
    queuePush(queue, 80);
    printf("%s\r\n",queueFull(queue) ? "full" : "empty");
    
    printf("%d\r\n",queuePop(queue));
    printf("%d\r\n",queuePop(queue));
    queuePush(queue, 90);
    queuePush(queue, 100);
    printf("%d\r\n",queuePop(queue));
    printf("%d\r\n",queuePop(queue));
    printf("%d\r\n",queuePop(queue));
    printf("%d\r\n",queuePop(queue));
    queueDestroy(queue);
    return 0;
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值