0x01.关于队列
队列是一种先进先出的数据结构,有入队(EnQueue)和出队(DeQueue)操作。因为数据的存放取出存在优先级的,所有广泛用于各种算法。
队列同样要注意队头指针和队尾指针。
关于循环队列,主要要知道判满与计算长度的数学思想。
0x02.基础数组队列
#define SIZE 50
typedef struct
{
int data[SIZE];
int head;
int tail;
}QUEUE;
QUEUE Q;
void iniqueue()
{
Q.head = 0;
Q.tail = 0;
return;
}
void EnQueue(int m)
{
if (Q.tail >= SIZE)
{
printf("队列已满,无法加入元素!!!");
return;
}
Q.data[Q.tail++] = m;
return;
}
void DeQueue()
{
if (Q.tail == Q.head)
{
printf("队列为空,无法取出元素!!!");
return;
}
int m = Q.data[Q.head++];
printf("队列头元素 %d 已取出!!!\n", m);
return;
}
0x03.循环队列
由来:普通的队列用着用着,很多的空间就被浪费掉了,循环队列使得队尾可以不断的循环移动,充分利用了空间。
#define SIZE 50
typedef struct
{
int data[SIZE];
int head;
int tail;
}QUEUE;
QUEUE Q;
void iniqueue()
{
Q.head = Q.tail = 0;
}
int isfull()
{
if (Q.head == (Q.tail + 1) % SIZE)
{
return 1;
}
return 0;
}
int isempty()
{
if (Q.head == Q.tail)
{
return 1;
}
return 0;
}
void en(int m)
{
if (isfull())
{
printf("循环队列已满,无法进行 入队 操作!!!");
return;
}
Q.data[Q.tail] = m;
Q.tail = (Q.tail + 1) % SIZE;
return;
}
void de()
{
if (isempty())
{
printf("循环队列为空,无法进行 出队 操作!!!");
}
int m = Q.data[Q.head];
Q.head = (Q.head + 1) % SIZE;
return;
}
void length()
{
int m = (Q.tail + SIZE - Q.head) % SIZE;
printf("队列的有效长度是 %d \n",m);
}
0x04.链表队列
typedef struct LINK
{
int data;
struct LINK* next;
}LINK;
typedef struct QUEUE
{
struct LINK* head;
struct LINK* tail;
int size;
};
QUEUE* Q=NULL;
void iniqueue()
{
Q = (QUEUE*)malloc(sizeof(QUEUE));
Q->head = Q->tail = (LINK*)malloc(sizeof(LINK));
Q->head->next = Q->tail->next = NULL;
Q->size = 0;
}
void en(int m)
{
LINK *pnew= (LINK*)malloc(sizeof(LINK));
pnew->data = m;
pnew->next = NULL;
Q->size++;
Q->tail->next = pnew;
Q->tail = pnew;
}
void de()
{
if (Q->size == 0)
{
printf("链表队列为空,无法进行 出队 操作!!!");
return;
}
LINK* tmp = Q->head->next;
Q->head->next = tmp->next;
free(tmp);
return;
}