一、队列定义
队列(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
关注公众号"小败日记",搬砖过程遇到的问题,大家一起探讨,资源共享