数据结构及算法基础 之栈与队列(二)


 
 

一、队列定义

  队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。与栈相反,队列是一种先进先出(First In First Out, FIFO)的线性表。与栈相同的是,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础。
  此前我们用浏览器的历史记录作为栈的例子让大家了解她的应用广泛,队列在现实中也是应用十分广泛。我们的输入缓冲区接受键盘的输入就是按队列的形式输入和输出的,不然的话就很容闹出问题

环形队列:
  环形队列也是队列的一种,环形队列它的容量是固定的,并且它的队头和队尾指针都可以随着元素入出队列而发生改变,这样循环队列逻辑上就好像是一个环形存储空间。但要注意的是,在实际的内存当中,不可能有真正的环形存储区,我们只是用顺序表模拟出来的逻辑上的循环。

 

二、环形队列代码实例:(也适用于多线程)

queue.h

#ifndef __QUEUE__H
#define __QUEUE__H
#include <pthread.h>
 
typedef int ElemType;
typedef struct _queue {
    ElemType *base;
    int front;
    int rear;
    pthread_mutex_t queueLock;
    int queueSize;
}queue_s, *queue_p;
 
#endif

queue.c

#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
 
 
/*环形队列*/
/*创建队列*/
int createQueue(queue_s *queue, int queueSize)
{
    queue->base = (ElemType *)malloc(sizeof(ElemType) * queueSize);
    if (NULL == queue->base) {
        perror("malloc error");
        return -1;
    }
    queue->front = queue->rear = 0;
    queue->queueSize = queueSize;
    pthread_mutex_init(&(queue->queueLock), NULL);
    return 0;
}
 
 
int __isFullQueue(queue_p queue)
{
    return (queue->front + 1) % queue->queueSize == queue->rear;
}
 
 
int isFullQueue(queue_p queue)
{
    int ret = 0;
    pthread_mutex_lock(&queue->queueLock);
    if ((queue->front + 1) % queue->queueSize == queue->rear)
        ret = 1;
    pthread_mutex_unlock(&queue->queueLock);
    return ret;
}
 
 
int __isEmptyQueue(queue_p queue)
{
    return queue->front == queue->rear;
}
 
 
int isEmptyQueue(queue_p queue)
{
    int ret = 0;
    pthread_mutex_lock(&queue->queueLock);
    if (queue->front == queue->rear)
        ret = 1;
    pthread_mutex_unlock(&queue->queueLock);
    return ret;
}
 
 
int pushQueue(queue_p queue, ElemType value)
{
    if (NULL == queue)
        return -1;
    if (__isFullQueue(queue))
        return -1;
    pthread_mutex_lock(&queue->queueLock);
    queue->base[queue->front] = value;
    queue->front = (queue->front + 1) % queue->queueSize;
    pthread_mutex_unlock(&queue->queueLock);
    return 0;
}
 
 
int popQueue(queue_p queue, ElemType *value)
{
    if (NULL == queue)
        return -1;
    if (__isEmptyQueue(queue))
        return -1;
    pthread_mutex_lock(&queue->queueLock);
    *value = queue->base[queue->rear];
    queue->rear = (queue->rear + 1) % queue->queueSize;
    pthread_mutex_unlock(&queue->queueLock);
    return 0;
}
 
 
#if 1
int main()
{
    int i;
    ElemType e;
    queue_s q;
 
    createQueue(&q, 20);
    printf("It is empty ?\t%s\n", isEmptyQueue(&q) ? "yes" : "no");
 
    for(i = 0; i < 20; i ++)
        pushQueue(&q, i);
    printf("It is full ?\t%s\n", isFullQueue(&q) ? "yes" : "no");
 
    popQueue(&q, &e);
    printf("value: %d\n", e);
    popQueue(&q, &e);
    printf("value: %d\n", e);
    popQueue(&q, &e);
    printf("value: %d\n", e);
 
     
    return 0;
}
 
#endif

 
 
 
 
 
 
 
关注公众号"小败日记",搬砖过程遇到的问题,大家一起探讨,资源共享

小败日记公众号

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值