基本概念
队列:和栈都是线性结构
区别:限制插入删除的位置与顺序表、链表、栈不同
特点:队尾插入、队头删除
这里主要实现用的最多的循环队列(实际上还是使用的一位数组)
循环队列的实现(C语言)
- 循环队列的结构定义
typedef int ElemType;
typedef struct Queue //循环队列定义
{
ElemType *data; //指向队列空间的指针
int head; //队头指针
int rear; //队尾指针
int size; //队列空间大小
}Queue;
- 循环队列的函数声明
与栈类似,队列的常见操作也就是初始化、入队、出队、取队头元素、判空、销毁这些操作
void InitQueue(Queue *que, int init_size);
Bool Empty(Queue *que);
Bool Push(Queue *que, ElemType value);
Bool Pop(Queue *que);
Bool Top(Queue *que, ElemType *reval);
void DestroyQueue(Queue *que);
- 循环队列函数的实现
#define true TRUE;
#define false FALSE;
static Bool Full(Queue *que)
{
if((que->rear+1) % que->size == que->head)
return TRUE;
return FALSE;
}
static Bool AppendSpace(Queue *que)
{
ElemType *new_space = (ElemType *)malloc(sizeof(ElemType) * que->size * 2);
if(new_space == NULL) return FALSE;
// 挪数据
int i=que->head;
for(;(i % que->size )< que->rear ;i++)
{
new_space[i]=que->data[i];
}
/*
int index=0;
while(que->head !=que->rear )
{
new_space[index++]=que->data[que->head ];
que->head=que->head % que->size ;
}*/
que->head =0;
que->rear =que->size -1; //que->rear=que->size -1,因为是留了一个没用的所以是10个用9个
free(que->data);
que->data = new_space;
que->size *= 2;
return TRUE;
}
void InitQueue(Queue *que, int init_size)
{
if(que == NULL) exit(0);
init_size =init_size>0 ? init_size : 10 ;
que->data =(ElemType*)malloc(sizeof(ElemType)* init_size);
if(que->data == NULL) exit(0);
que->head = que->rear = 0;
que->size = init_size;
}
Bool Empty(Queue *que)
{
if(que == NULL) exit(0);
if(que->head == que->rear) return TRUE;
return FALSE;
}
Bool Push(Queue *que, ElemType value)
{
if(que == NULL) exit(0);
if(Full(que))
{
if(!AppendSpace(que))
{
return FALSE;
}
}
que->data[que->rear]=value;
que->rear +=1;
que->rear %=que->size ;
return TRUE;
}
Bool Pop(Queue *que)
{
if(que == NULL) exit(0);
if(Empty(que)) return FALSE;
que->head += 1;
que->head %= que->size;
return TRUE;
}
Bool Top(Queue *que, ElemType *reval)
{
if(que == NULL) exit(0);
if(Empty(que)) return FALSE;
*reval = que->data[que->head ];
return TRUE;
}
void DestroyQueue(Queue *que)
{
if(que == NULL) exit(0);
free(que->data);
que->data = NULL;
que->head = que->rear = que->size = 0;
}