目录
一.队列定义
队列是限制在两端进行插入操作和删除操作的线性表
1.允许进行存入操作的一端称为“队尾”
允许进行删除操作的一端称为“队头”
当线性表中没有元素时,称为“空队”
2.特点 :先进先出(FIFO)
跟现实中排队是一样的
3.队列的应用
5.队列的操作包括
创建队列 :CreateQueue ()
清空队列 :ClearQueue (Q)
判断队列空 :EmptyQueue(Q)
判断队列满 :FullQueue(Q)
入队 :EnQueue (Q , x)
出队 :DeQueue(Q)
二.顺序队列
1.代码定义
typedef int data_t ; /*定义队列中数据元素的数据类型*/
#define N 64 /*定义队列的容量*/
typedef struct
{
data_t data[N] ; /*用数组作为队列的储存空间*/
int front, rear ; /*指示队头位置和队尾位置*/
} sequeue_t ; /*顺序队列类型定义*/
2.规定说明
front指向队头元素的位置; rear指向队尾元素的下一个位置。
其实rear是存新值的位置
在队列操作过程中,为了提高效率,以调整指针代替队列元素的移动,并将数组作为循环队列的操作空间。
设两个指针front,rear,约定:
Q.rear指示队尾元素的下一个位置;
Q.front指示队头元素 初值Q.front=Q.rear=0
为区别空队和满队,满队元素个数比数组元素个数少一个。
从0-5依次入队
3.操作顺序队列实现
(1)为了实现循环的效果,要让rear+1取余,这样就可以把rear限制在0-某个数之间,虽然rear一直在加但是余数限制在一个范围内了,同理对front操作加一,都必须是以+1后取余的操作
(2)判断队列是否满的时候,要注意留一个空位置出来
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sequeue.h"
sequeue * queue_create()
{
sequeue *sq;
if ((sq = (sequeue *)malloc(sizeof(sequeue))) == NULL)
{
printf("malloc failed\n");
return NULL;
}
memset(sq->data, 0, sizeof(sq->data));
sq->front = sq->rear = 0;
return sq;
}
int enqueue(sequeue *sq, datatype x)
{
if (sq == NULL)
{
printf("sq is NULL\n");
return -1;
}
if ((sq->rear + 1) % N == sq->front)
{
printf("sequeue is full\n");
return -1;
}
sq->data[sq->rear] = x;
sq->rear = (sq->rear + 1) % N;
return 0;
}
datatype dequeue(sequeue *sq)
{
datatype ret;
ret = sq->data[sq->front];
sq->front = (sq->front + 1) % N;
return ret;
}
int queue_empty(sequeue *sq)
{
if (sq == NULL)
{
printf("sq is NULL\n");
return -1;
}
return (sq->front == sq->rear ? 1 : 0);
}
int queue_full(sequeue *sq)
{
if (sq == NULL)
{
printf("sq is NULL\n");
return -1;
}
if ((sq->rear + 1) % N == sq->front)
{
return 1;
}
else {
return 0;
}
}
int queue_clear(sequeue *sq)
{
if (sq == NULL)
{
printf("sq is NULL\n");
return -1;
}
sq->front = sq->rear = 0;
return 0;
}
sequeue * queue_free(sequeue *sq)
{
if (sq == NULL)
{
printf("sq is NULL\n");
return NULL;
}
free(sq);
sq = NULL;
return NULL;
}