算法设计题:对于循环队列,利用队列的基本运算,设计删除队列中从队头开始的第k个元素的算法。
代码实现:
需要c语言的指针 结构体 基础。
代码语言:javascript复制// Cat00011cat thecat.top
#include <stdio.h>
#include <malloc.h> // 用于new运算申请空间
#include <stdlib.h> // exit 函数需要用到
//3.算法设计题:对于循环队列,利用队列的基本运算,设计删除队列中 从队头开始的第k个元素 的算法。
// 定义空间空间大小
#define MAXSIZE 100
typedef struct{
int *base; // 存储空间基地址
int front; // 头指针
int rear; // 尾指针
}SqQueue;
//定义枚举类型的状态码
typedef enum {
OK,
OVERFLOW,
ERR
} Status;
// 循环队列初始化
Status InitQueue(SqQueue &Q) {
// 构造空队列
Q.base = (int *)malloc(MAXSIZE * sizeof(int)); // 为队列分配数组空间
// 容错处理 假设地址空间分配失败
if (!Q.base) {
exit(OVERFLOW); // 直接退出
}
// 地址空间分配成功
Q.front = Q.rear = 0; // 设置队列为空,将头尾赋值为0
return OK; // 分配成功返回枚举结构的OK
}
// 元素入队 (队尾插入 对头删除)
Status EnQueue(SqQueue &Q, int e){
// 插入元素e为Q的新队尾元素
//判断队列是否为满
if((Q.rear 1)%MAXSIZE==Q.front){ // 尾指针 1等于头指针 那么 队满
return ERR;
}
// 队未满,那么元素入队
Q.base[Q.rear]=e; // 元素e从队尾进入数组
Q.rear=(Q.rear 1)%MAXSIZE; // 队尾指针加一,,e占了一个位置
return OK;
}
// 读取元素 求队列长度
int getHead(SqQueue Q){
// 返回Q的对头元素 不修改指针
if(Q.front!=Q.rear){ // 队列非空 才能读取
return Q.base[Q.front]; //返回对头元素,对头指针不动
}
}
// 出队 位置k 的元素
// 他之前的元素都必须先出队. k - front 元素全部出去
Status DeQueueElem_K(SqQueue &Q, int k){
//如果 对空 那么不删除 ..直接跳出
if(Q.front==Q.rear){
return ERR;
}
// 直接根据给定的k值 出队,,k是多少 就直接从对头开始出队几次.
for(int i=0;i<k;i ){
//对头指针 1
Q.front=(Q.front 1)%MAXSIZE;
}
return OK;
}
int main(){
int k = 3; // 删除位置3开始前面的全部元素
SqQueue Q; // 定义结构体Q
InitQueue(Q); // 初始化
printf("队列初始化成功nn");
for(int i=1;i<=8;i ){
EnQueue(Q,i); // 模拟输入数字1-8
}
printf("开始向队列存入元素 1 2 3 4 5 6 7 8 nn");
printf("删除从%d开始前边的元素之 前 的队列",k);
for (int i = Q.front; i != Q.rear; i = (i 1) % MAXSIZE) {
printf("%d ", Q.base[i]);
}
DeQueueElem_K(Q, k);
printf("开始删除第%d个开始之前的元素nn",k);
printf("删除从%d开始前边的元素之 后 的队列",k);
for (int i = Q.front; i != Q.rear; i = (i 1) % MAXSIZE) {
printf("%d ", Q.base[i]);
}
return 0;
}
执行结果:
算法解析工学云习讯云黔职通实现自动化签到队列算法,先进先出规则。队尾插入对头删除。
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表
两只章鱼
在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进:无论插入或删除,一旦rear指针增1或front指针增1 时超出了所分配的队列空间,就让它指向这片连续空间的起始位置。自己真从MaxSize-1增1变到0,可用取余运算rear%MaxSize和front%MaxSize来实现。这实际上是把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列。除了一些简单应用之外,真正实用的队列是循环队列。