c++数据结构算法复习基础--7--线性表-队列-常用操作接口-复杂度分析

news2024/10/28 23:40:18

1、队列

特点:先进先出,后进后出

环形队列(依赖数组实现,单必须实现环形)

链式队列(依赖链表实现)

2、环形队列

理论

常规数组思想随着队列的不断使用,会出现越界
在这里插入图片描述
所以要将其设计成环形结构
在这里插入图片描述

边界判断

当不断加入元素,会出现队列使用满的情况,此时不是first == rear == 0,
在这里插入图片描述

在这里插入图片描述
在环形队列中,会留下一个位置,用来区分队列是否满的一个状态。

first == rear //队列为空
(rear + 1)%length == first //队列为满

代码实现

#include<iostream>

using namespace std;

//环形队列   
//容器适配器queue常用操作 --  push(入队)  pop(出队)  front(获取队头元素) back(获取队尾元素) empty(队列是否为空) size(队列元素个数)
class Queue
{
public:
	Queue(int size = 10)
		: cap_(size)
		, front_(0)
		, rear_(0)
		,size_(0)
	{
		pQue_ = new int[cap_];
	}
	~Queue()
	{
		delete[]pQue_;
		pQue_ = nullptr;
	}
	//入队,入队尾
	void push(int val)
	{
		if ((rear_ + 1) % cap_ == front_)//队满
		{
			expand(2 * cap_);
		}
		pQue_[rear_] = val;
		rear_ = (rear_ + 1) % cap_;
		size_++;
	}
	//出队,出队头
	void pop()
	{
		if (front_ == rear_)
			throw "queue is empty!";
		front_ = (front_ + 1) % cap_;
		size_--;
	}
	//获取队头元素
	int front()const
	{
		if (front_ == rear_)
			throw "stack is empty!";
		return pQue_[front_];
	}
	//获取队尾元素
	int back()const
	{
		if (front_ == rear_)
			throw "stack is empty!";
		/*if (rear_ == 0)
		{
			return pQue_[cap_-1];
		}
		return pQue_[rear_-1];*/

		return pQue_[(rear_ - 1 + cap_) % cap_];

	}

	//判断是否栈空
	bool empty()const
	{
		return front_ == rear_;
	}
	//判断栈的元素个数
	int size() const   //方法一,添加一个成员变量,如果考虑多线程操作,该方法不可行
	{
		//return size_;
		//方法二: 遍历一遍队列统计元素个数 O(n)
		int size = 0;
		for (int i = front_; i != rear_; i = (i + 1) % cap_)
		{
			size++;
		}
		return size;
	}

private:
	void expand(int size)//扩容接口,这里不能直接memcpy
	{
		int* p = new int[size];

		int i = front_;  //遍历原队列
		int j = 0;       //遍历新队列
		for (; i != rear_; i = (i + 1) % cap_,j++)
		{
			p[j] = pQue_[i];
		}
		delete[]pQue_;
		pQue_ = p;
		cap_ = size;
		front_ = 0;
		rear_ = j;
	}
private:
	int* pQue_;
	int cap_;   //空间容量
	int front_; //队头,入栈指针
	int rear_;  //队尾、出栈指针
	int size_;  //元素个数
};

测试

int main()
{
	int arr[] = { 5,10,66,77,88,99,100,111 }; 
	Queue que;

	for (int v : arr)
	{
		que.push(v);
	}

	cout << que.front() << endl;
	cout << que.back() << endl;

	//扩容
	que.push(200);
	que.push(300);
	que.push(400);

	cout << que.front() << endl;
	cout << que.back() << endl;

	while (!que.empty())
	{
		cout << que.front() <<"    "<< que.back() << endl;
		que.pop();
	}
}

测试结果

在这里插入图片描述

3、链式队列

基于双向循环链表实现的链式队列
队尾进,队头出

Java 里面有Linkedin的数据结构,可以充当栈、队列,基于链表实现。

代码实现

//环形队列   
//容器适配器queue常用操作 --  push(入队)  pop(出队)  front(获取队头元素) back(获取队尾元素) empty(队列是否为空) size(队列元素个数)
class LinkQueue
{
public:
	LinkQueue():size_(0)
	{
		head_ = new Node();
		head_->next_ = head_;
		head_->pre_ = head_;
	}
	~LinkQueue()
	{
		Node* p = head_->next_;
		while (p != head_)
		{
			head_->next_ = p->next_;
			p->next_->pre_ = head_;
			delete p;
			p = head_->next_;
		}
		delete head_;
		head_ = nullptr;
	}
public:
	//入队,入队尾
	void push(int val)
	{
		Node* node = new Node(val);

		node->next_ = head_;
		node->pre_ = head_->pre_;
		head_->pre_->next_ = node;
		head_->pre_ = node;

		size_++;
	}
	//出队,出队头
	void pop()
	{
		if (head_->pre_ == head_)
			throw "queue is empty!";

		Node* p = head_->next_;
		
		head_->next_ = p->next_;
		p->next_->pre_ = head_;
		delete p;
		p = nullptr;

		size_--;
	}
	//获取队头元素
	int front()const
	{
		if (head_->next_ == head_)
			throw "stack is empty!";
		return head_->next_->data_;
	}
	//获取队尾元素
	int back()const
	{
		if (head_->next_ == head_)
			throw "stack is empty!";
		return head_->pre_->data_;

	}

	//判断是否栈空
	bool empty()const
	{
		return head_->next_ == head_;
	}
	//判断栈的元素个数
	int size() const   //方法一,添加一个成员变量,如果考虑多线程操作,该方法不可行
	{
		return size_;
		//方法二: 遍历一遍队列统计元素个数 O(n)
	}

private:
	struct Node
	{
		Node(int data = 0)
			:data_(data)
			, next_(nullptr)
			, pre_(nullptr)
		{}
		int data_;
		Node* next_;
		Node* pre_;
	};

	Node* head_;//指向头节点
	int size_;
	
};

测试

int main()
{
	int arr[] = { 5,10,66,77,88,99,100,111 }; 
	LinkQueue que;

	for (int v : arr)
	{
		que.push(v);
	}

	que.push(200);
	que.push(300);

	cout << que.front() << endl;
	cout << que.back() << endl;

	while (!que.empty())
	{
		cout << que.front() <<"    "<< que.back() << endl;
		que.pop();
	}
}

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2225779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拍拍贷鸿蒙版H5容器之路

背景介绍 业务背景 2024年1月18日华为宣布&#xff1a;HarmonyOS NEXT 将不再支持 Android系统&#xff0c;基于以上背景及国内信贷业务现状&#xff0c;公司决定启动借款App鸿蒙化项目。 下图是2024年6月华为HDC大会上&#xff0c;华为宣布 HarmonyOS NEXT 将面向开发者和先…

Cisco Packet Tracer 8.0 路由器的基本配置和Telnet设置

文章目录 构建拓扑图配置IP地址配置路由器命令说明测试效果 构建拓扑图 1&#xff0c;添加2811路由器。 2&#xff0c;添加pc0。 3&#xff0c;使用交叉线连接路由器和pc&#xff08;注意线路端口&#xff09;。 4&#xff0c;使用配置线连接路由器和pc&#xff08;注意线路…

IT监控对接华三CAS云管平台监控方案

概述 CAS云管平台是新华三集团自主研发的虚拟化和云计算管理平台&#xff0c;它主要面向数据中心&#xff0c;提供虚拟化和云计算管理&#xff0c;在教育行业、网络安全领域、高性能计算业务、企业IT部门等领域被广泛应用。在信创国产化背景下&#xff0c;以CAS、Fusion等为代…

rtp协议:rtcp包格式和传输间隔

RTP Control Protocol -- RTCP-rtp控制协议 实时传输控制协议&#xff08;RTCP&#xff09;基于对会话中的所有参与者定期传输控制包&#xff0c;使用与数据包相同的分发机制。底层协议必须提供数据包和控制包的多路复用&#xff0c;例如使用UDP时使用不同的端口号。RTCP执行四…

LLMs 入门实战系列大全:LLMs应用、领域大模型介绍、大模型常见面经汇总

1. 常见大模型介绍 1.1 ChatGLM-6B 系列 ChatGLM2-6B [【ChatGLM2-6B 入门】清华大学开源中文版 ChatGLM-6B 模型学习与实战] 更强大的性能&#xff1a;基于 ChatGLM 初代模型的开发经验&#xff0c;我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目…

sa-token 所有的异常都是未登录异常的问题

在使用satoken的时候&#xff0c;有这么一个问题&#xff0c;就是不管我是什么错误&#xff0c;都会弹出未登录异常&#xff0c;起初的时候我以为satoken的拦截器会拦截所有的异常&#xff0c;但是今后测试才发现忽略了一点&#xff0c;也是最重要最容易忽视的一点。 如果我现在…

动态规划 —— 路径问题-不同路径

1. 不同路径 题目链接&#xff1a; 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/unique-paths/description/ 2. 算法原理 1. 状态表示&#xff1a;以莫一个位置为结尾 dp[i]表示&#xff1a;以[i&#xff0c;j]位置为结尾时&#xff0…

新手入门c++(8)

到时候了&#xff0c;是时候给你们讲一下其他的定义形式与格式化输入输出了。 1.长整型变量 长整型变量分为两种&#xff1a; ①long类型 在计算机编程中&#xff0c;long 类型是一个整型数据类型&#xff0c;用于存储较大的整数。它的大小和范围取决于操作系统和编译器的实…

存储引用服务(OSS)Minio 环境搭建

下载Docker desktop 最好进行相关的设置&#xff0c;比如说进行登陆docker账号等等 推荐使用 docker-engine源【目前还能使用下载】 https://ccr.ccs.tencentyun.com 使用docker拉取对应的minio镜像 netstat -aon|findstr "8081" 注意&#xff1a;dockerhub有时…

QT访问数据库:应用提示Driver not loaded

在QT中运行完全正确错误截图 解决办法 我用的是MySQL。我把libmysql.dll复制到应用程序的目录下&#xff0c;即可正常访问数据库。

Hugging Face 使用指南——并行智算云(10s上手版)

1. 在bash中使用 1.1 直接复制命令 echo export HF_ENDPOINT"https://hf-mirror.com" >> ~/.bashrc # 在bashrc文件中设置镜像地址 source ~/.bashrc # 使修改立即生效 echo $HF_ENDPOINT # 查看是否成功红框部分出现就是正确了 1.2 命令详解 命令行echo…

HarmonyOS开发 - 本地持久化之实现LocalStorage支持多实例

用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。数据存储形式为键值对&#xff0c;键的类型为字符串型&#xff0c;值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。 在上一篇中&…

CodeQL学习笔记(1)-QL语法(逻辑连接词、量词、聚合词、谓词和类)

最近在学习CodeQL&#xff0c;对于CodeQL就不介绍了&#xff0c;目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记&#xff0c;根据个人知识库笔记修改整理而来的&#xff0c;分享出来共同学习。个人觉得QL的语法比较反人类&#xff0c;至少与目前主流的这些OOP语言相比&…

计算机视觉专栏(2)【LeNet】代码实战【pytorch】完整可运行

LeNet 系列 实践部分1.引言2. limu代码3. plpal代码3.1 代码调试3.2 代码详解 4. 总结 实践部分 Lenet的实现分为两种代码&#xff0c;一种是李沐老师的实现代码以及b友up霹雳啪啦的代码&#xff0c;两者都有不同的优点&#xff0c;李老师的lenet十分还原原著中的操作&#xf…

ios 项目升级极光SDK

由于项目使用的是旧版本&#xff0c;隐私合规检查不通过&#xff0c;需要升级到最新版本&#xff0c; 使用cocoapods集成无法正常运行&#xff0c;.a文件找不到&#xff0c;可能项目比较久了&#xff0c;最好选择手动导入 下载最新版本SDK&#xff0c;将 SDK 包解压&#xff…

IROS 2024最新接收的Motion Planning前沿研究成果汇总

No.1 文章标题&#xff1a;Extended Tree Search for Robot Task and Motion Planning 作者&#xff1a;REN, Tianyu; Chalvatzaki, Georgia; Peters, Jan 中文标题&#xff1a;机器人任务和运动规划的扩展树搜索 No.2 文章标题&#xff1a;Kinodynamic Motion Planning fo…

Jmeter分布式性能测试细节+常见问题解决

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Jmeter分布式测试时需要的特别注意 1&#xff09;参数化文件的位置和内容 如果使用csv文件进行参数化&#xff0c;即通过读取csv文件中的数据来为测试脚本提供…

C/C++每日一练:实现选择排序

选择排序 选择排序是一种简单直观的排序算法&#xff0c;时间复杂度为&#xff0c;其中 n 是数组长度&#xff0c;不适合大数据集的排序&#xff0c;适合于元素较少且对性能要求不高的场景。 选择排序的基本思想是&#xff1a;每次从未排序部分选择最小的元素&#xff0c;将其放…

[四轴飞行器] 遥控器操作说明

遥控器操作说明 1 A&#xff1a;无线连接信号强度&#xff1a;已连接 B&#xff1a;控制模式&#xff1a;H定高模式,T定点模式 C&#xff1a;遥控器状态&#xff1a;加锁 D&#xff1a;飞行模式&#xff1a;无头 E&#xff1a;电量显示&#xff1a;遥控器电量&#xff08;加…

OpenCV系列教程六:信用卡数字识别、人脸检测、车牌/答题卡识别、OCR

文章目录 一、信用卡数字识别1.1 模板匹配1.2 匹配多个对象1.3 处理数字模板1.4 预处理卡片信息&#xff0c;得到4组数字块。1.5 遍历数字块&#xff0c;将卡片中每个数字与模板数字进行匹配 二、人脸检测2.1人脸检测算法原理2.2 OpenCV中的人脸检测流程 三、车牌识别3.1 安装t…