前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构C语言实验三之循环队列

数据结构C语言实验三之循环队列

原创
作者头像
菜菜有点菜
修改2023-11-24 11:00:47
1880
修改2023-11-24 11:00:47
举报
文章被收录于专栏:白菜博客白菜博客

算法设计题:对于循环队列,利用队列的基本运算,设计删除队列中从队头开始的第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("队列初始化成功\n\n");
    
    for(int i=1;i<=8;i++){
    	EnQueue(Q,i);	// 模拟输入数字1-8 
	} 
    printf("开始向队列存入元素 1 2 3 4 5 6 7 8 \n\n");
    
    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个开始之前的元素\n\n",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来实现。这实际上是把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列。除了一些简单应用之外,真正实用的队列是循环队列。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档