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

2023-11-24 11:00:47 浏览数 (2)

算法设计题:对于循环队列,利用队列的基本运算,设计删除队列中从队头开始的第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来实现。这实际上是把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列。除了一些简单应用之外,真正实用的队列是循环队列。

0 人点赞