数据结构列表和队列(数据结构---队列复习)
数据结构列表和队列(数据结构---队列复习)3.队列算法2.循环静态队列出队静态队列通常都必须是循环队列,来提高数组的利用率。如果要删除元素(出队),f 只能加(往数组最大下标方向增加);如果要增加元素(入队), r 只能加(往数组最大下标方向增加)。非循环的话出队列后的内存就无法再入队列,浪费内存。循环队列需要几个参数来确定?---front和rear,front 代表的是队列的第一个元素,rear 代表的是队列的最后一个有效元素的下一个元素。1.静态队列出队
1.队列定义:一种可以实现先进先出的存储结构,类似于排队买票。
2.队列分类:
(1)静态队列:用数组实现
(2)链式队列:用链表实现
静态队列通常都必须是循环队列,来提高数组的利用率。如果要删除元素(出队),f 只能加(往数组最大下标方向增加);如果要增加元素(入队), r 只能加(往数组最大下标方向增加)。非循环的话出队列后的内存就无法再入队列,浪费内存。
循环队列需要几个参数来确定?---front和rear,front 代表的是队列的第一个元素,rear 代表的是队列的最后一个有效元素的下一个元素。
1.静态队列出队
2.循环静态队列出队
3.队列算法
//静态队列,用循环数组
//队列的两个参数:front、rear
typedef struct Queue
{
int* pBase; //数组
int front;//队列头
int rear;//队列尾
}QUEUE;
3.1队列初始化,front 和 rear 的值都是零。
//队列初始化
void init_queue(struct Queue* pQ)
{
pQ->pBase = (int*)malloc(sizeof(int)*6);//数组分配6个int型内存
pQ->front = 0;//队列头下标为0
pQ->rear = 0;//队列尾下标为0
}
3.2如何判断队列已满:如果 r 和 f 的值紧挨着,则队列已满,n - 1 个元素可以被使用(分配6个内存,使用5个存数据,剩余一个用作队列判断)。
//队列是否满了
int full_queue(struct Queue* pQ)
{//队列满时 rear / front 紧挨着,由于是循环所以对数组长度取余
if ((pQ->rear 1)%6 == pQ->front) {
return 0;
}
return -1;
}
3.3队列是否为空,队列尾与队列头相同则为空。
//队列是否为空,队列尾与队列头相同则为空
int empty_queue(QUEUE* pQ)
{
if (pQ->front == pQ->rear) {
return 0;
}
return -1;
}
3.4遍历队列
//遍历队列
void travserse_queue(QUEUE* pQ)
{//从队列头开始,直至队列尾
int i = pQ->front;//获取队列头
while (i != pQ->rear) {//是否到队尾
printf("%d " pQ->pBase[i]);//输出数据
i = (i 1) % 6;
}
printf("\n");
return;
}
3.5入队,两步完成:
1).将值存入 r 所代表的位置
2).r=(r 1)% 数组的长度
//入队,往队列放值
//哪个队列,值为多少
int en_queue(struct Queue* pQ int val)
{
if (full_queue(pQ) == 0) {//队列满了
return -1;
}
else {
pQ->pBase[pQ->rear] = val;//val值放入队列的尾
pQ->rear = (pQ->rear 1) % 6;//队尾上移 1,因循环队列,故对数组长度取余
}
return 0;
}
3.6出队
//出队列,先保存队列值,再将队头上移
int out_queue(QUEUE* pQ int* pVal)
{
if (empty_queue(pQ) == 0) {
return -1;
}
*pVal = pQ->pBase[pQ->front];//保存要出队列的值
pQ->front = (pQ->front 1) % 6;//循环队列%
return 0;
}
4.调试代码与结果
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "malloc.h"
#include "queue.h"
int main()
{
////////////////////////////queue.c test ////////////////////////
struct Queue Q;
int val;
init_queue(&Q);//初始化队列
en_queue(&Q 1);//进队列
en_queue(&Q 2);
en_queue(&Q 3);
en_queue(&Q 4);
en_queue(&Q 5);
printf("入队后的结果:\n");
travserse_queue(&Q);//遍历输出队列
if (out_queue(&Q &val) == 0) {
printf("出队列成功,队列出队元素是:%d\n" val);
}
else {
printf("出队列失败!\n");
}
travserse_queue(&Q);//遍历输出队列
//////////////////////////// queue.c test end ////////////////////////
return 0;
}
3.代码调试结果