首页 > 编程语言 >【数据结构与算法】在循环队列中第k个元素之后插入元素的算法 C++实现(循环队列+模运算)

【数据结构与算法】在循环队列中第k个元素之后插入元素的算法 C++实现(循环队列+模运算)

时间:2024-08-07 13:26:49浏览次数:18  
标签:return CircularQueue 队列 元素 MaxSize int 算法 front rear

数组a[MaxSize]用作一个循环队列,front指向循环队列中队头元素的前一个位置,rear指向队尾元素的位置。设计在队列中第k个元素之后插入item的算法。


思路

首先,检查输入的位置 k 是否在合理的范围内,即 1queueSize(Q)(包含两端)。如果 k 在这个范围外,那么返回 ERROR

然后,计算插入位置 l。这里使用了模运算来处理循环队列的环状结构。如果 l 在队列的尾部和头部之间,那么 l 就是插入位置。否则,l 就是插入位置加上 MaxSize

接下来,将队列的尾部 Q.rear 向后移动一位,为新元素 e 留出空位。这里也使用了模运算来处理循环队列的环状结构。

然后,从队列的尾部开始,将每个元素向后移动一位,直到到达插入位置 l。这个过程是通过一个循环来实现的,每次循环都将位置 p 的元素移动到位置 q,然后将 p 更新为 q

最后,将新元素 e 插入到位置 l,然后返回 OK

时间复杂度是 O ( n ) O(n) O(n),其中 n n n 是队列的大小。这是因为在最坏的情况下,可能需要移动队列中的所有元素。空间复杂度是 O ( 1 ) O(1) O(1),因为只使用了固定数量的额外空间,不依赖于输入的大小。


代码

#include <algorithm>
#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;
using Status = int;
using ElemType = int;

const int N = 1e6 + 7;
const int MaxSize = 100;
const int TRUE = 1;
const int FALSE = 0;
const int OK = 1;
const int ERROR = 0;
const int INFEASIBLE = -1;
// const int OVERFLOW = -2;

int n;
ElemType a[N];

struct CircularQueue {
	ElemType a[MaxSize];
	int front, rear;
};

Status initQueue(CircularQueue &Q) {
	Q.front = Q.rear = 0;
	return OK;
}

bool queueFull(CircularQueue Q) { return ((Q.rear + 1) % MaxSize == Q.front); }

bool queueEmpty(CircularQueue Q) { return (Q.front == Q.rear); }

int queueSize(CircularQueue &Q) {
	return ((Q.rear - Q.front + MaxSize) % MaxSize);
}

Status queuePush(CircularQueue &Q, ElemType e) {
	if (queueFull(Q)) {
		return ERROR;
	}
	Q.a[Q.rear] = e;
	Q.rear = (Q.rear + 1) % MaxSize;
	return OK;
}

ElemType queueFront(CircularQueue Q) {
	if (queueEmpty(Q)) {
		return NULL;
	}
	return Q.a[Q.front];
}

Status queuePop(CircularQueue &Q) {
	if (queueEmpty(Q)) {
		return ERROR;
	}
	Q.front = (Q.front + 1) % MaxSize;
	return OK;
}

Status queueInsert(CircularQueue &Q, int k, ElemType e) {
	if (k < 1 || k > queueSize(Q)) {
		return ERROR;
	}
	int l = (Q.front + k - 1) % MaxSize;
	int p = Q.rear;
	Q.rear = (Q.rear + 1) % MaxSize;
	while (l < p) {
		int q = (p - 1) % MaxSize;
		Q.a[p] = Q.a[q];
		p = q;
	}
	Q.a[l] = e;
	return OK;
}

int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}

	CircularQueue Q;
	initQueue(Q);

	for (int i = 0; i < n; i++) {
		queuePush(Q, a[i]);
	}

	for (int i = 0; i < n; i++) {
		int f = queueFront(Q);
		cout << queueFront(Q) << " ";
		queuePop(Q);
		queuePush(Q, f);
	}
	cout << "\n";

	int k;
	ElemType e;
	cin >> k >> e;
	n += queueInsert(Q, k, e);

	for (int i = 0; i < n; i++) {
		int f = queueFront(Q);
		cout << queueFront(Q) << " ";
		queuePop(Q);
		queuePush(Q, f);
	}
	cout << "\n";
	return 0;
}

标签:return,CircularQueue,队列,元素,MaxSize,int,算法,front,rear
From: https://blog.csdn.net/qq_34988204/article/details/137449293

相关文章

  • 算法力扣刷题记录 六十八【131.分割回文串】
    前言回溯章节第六篇。切割问题。记录六十八【131.分割回文串】。一、题目阅读给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。回文串指字符串从前读和从后读一样。返回s所有可能的分割方案。示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]......
  • Java计算机毕业设计基于协同过滤算法的商品推荐系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在信息爆炸的时代,电商平台上的商品数量呈指数级增长,用户在面对海量商品时往往感到无所适从,难以快速找到符合自身需求和喜好的商品。传统的搜索方式虽......
  • 【NOI】C++算法设计入门之穷举
    文章目录前言一、概念1.导入2.概念二、例题讲解1.简单穷举问题:1015.鸡兔同笼问题问题:1351.买公园门票问题:1016.买小猫小狗问题:1220.买糕点问题:1396.开学大采购?2.嵌套穷举问题:1022.百钱百鸡问题问题:1024.购买文具问题:1249.搬砖问题问题:1250.马克思手稿的问题......
  • 「代码随想录算法训练营」第三十一天 | 动态规划 part4
    1049.最后一块石头的重量II题目链接:https://leetcode.cn/problems/last-stone-weight-ii/题目难度:中等文章讲解:https://programmercarl.com/1049.最后一块石头的重量II.html视频讲解:https://www.bilibili.com/video/BV14M411C7oV/题目状态:看题解过思路:本题本质上就是将......
  • 代码随想录算法训练营第62天 | 最短路径:dijkstra(堆优化版)+ Bellman_ford算法
    47.参加科学大会https://kamacoder.com/problempage.php?pid=1047dijkstra(堆优化版)精讲https://www.programmercarl.com/kamacoder/0047.参会dijkstra堆.html#思路94.城市间货物运输Ihttps://kamacoder.com/problempage.php?pid=1152Bellman_ford算法精讲https://www.pr......
  • 排序算法
    排序算法BUBSort冒泡排序伪代码do-swapped=false-fromi=1to最后一个没有排序过元素的索引-1-ifleft>right--swap(left,right)--swapped=truewhileswapped代码实现voidBubSort(){inttem=0;boolswapped;do{t......
  • 代码随想录算法训练营第61天 | 图论part08:拓扑排序+迪杰斯特拉朴素法
    117.软件构建https://kamacoder.com/problempage.php?pid=1191拓扑排序精讲https://www.programmercarl.com/kamacoder/0117.软件构建.html#拓扑排序的背景47.参加科学大会https://kamacoder.com/problempage.php?pid=1047dijkstra(朴素版)精讲https://www.programmercarl.c......
  • 请遍历一个数组 , 输出数组的各个元素值。
    1publicclassshuzu21{2//编写一个main方法3publicstaticvoidmain(String[]args){45//编写一个数组,输出数组的各个元素值6int[][]map={{0,0,1},{1,1,1},{1,1,3}};7//使用方法完成输出,创建MyTools对象89......
  • 【数值计算方法】线性方程组迭代算法的Python实现
    线性方程组迭代算法的Python实现jacobi迭代法defJacobiIter(A:np.ndarray,b:np.ndarray,tol:float=1e-5,maxIter:int=100)->Tuple[np.ndarray,np.ndarray]:"""使用Jacobi迭代法求解线性方程组Ax=binput:......
  • 排序算法优化思考
    引言排序算法是人们研究的最多的一类计算机算法,也是计算机中最基础、使用频率最高的一类算法。虽然对排序算法的理论研究在目前看来被认为已经是最优解,但面对工业界各类问题,人们还是持续提出了针对特定场景的“更优”的算法。通过对排序算法的研究和优化,我们可以清晰的感受......