当前位置: 首页 > news >正文

OJ第五篇

文章目录

  • 用队列实现栈
  • 用栈实现队列
  • 设计循环队列

用队列实现栈

链接:用队列实现栈
在这里插入图片描述

这道题是让我们用两个队列实现一个栈,简单来说,就是利用队列来实现一个先入后出的功能,我们知道队列是先入先出,如何用两个队列来实现后入先出呢?比如说,
我们现在有五个数据进入了第一个队列
在这里插入图片描述
之后我们如果要按照栈的形式取出数据的话,要取出5,只靠队列一肯定是不行了,要把前四个数据挪到队列二,再把五取出来就可以了
在这里插入图片描述
这时取出4还是一样的操作,挪动在取出。如果要插入呢?肯定要插在4的后面,不知道你有没有发现,两个队列总是一个为空,另一个可能空(刚开始什么数据都没有),也可能不空。
总结:插入的话就插入非空的队列,取出的话就是先挪动在取出。


typedef struct {
Que queue1;
Que queue2;
} MyStack;MyStack* myStackCreate() {
MyStack*obj=(MyStack*)malloc(sizeof(MyStack));
QueueInit(&obj->queue1);
QueueInit(&obj->queue2);
return obj;
}void myStackPush(MyStack* obj, int x) {
if(!QueueEmpty(&obj->queue1)){QueuePush(&obj->queue1,x);
}
else{QueuePush(&obj->queue2,x);
}
}int myStackTop(MyStack* obj) {
if(!QueueEmpty(&obj->queue1)){
return QueueBack(&obj->queue1);
}
else{return QueueBack(&obj->queue2);
}
}int myStackPop(MyStack* obj) { 
Que* Empty=&obj->queue1;
Que* UnEmpty=&obj->queue2;
if(!QueueEmpty(&obj->queue1)){Empty=&obj->queue2;UnEmpty=&obj->queue1;
}
while(QueueSize(UnEmpty)>1){QDataType tmp= QueueFront(UnEmpty);QueuePop(UnEmpty);QueuePush(Empty,tmp);
}QDataType tmp= QueueFront(UnEmpty);QueuePop(UnEmpty);return tmp;
}bool myStackEmpty(MyStack* obj) {
return QueueEmpty(&obj->queue1)&&QueueEmpty(&obj->queue2);
}void myStackFree(MyStack* obj) {
QueueDestroy(&obj->queue1);
QueueDestroy(&obj->queue2);
free(obj);
}

这里只有实现的栈的函数代码,当然我们需要把自己实现的队列的代码粘贴到题中,也可以看我的另外一篇博客,那里面有源码
链接:栈和队列

用栈实现队列

链接:用栈实现队列
在这里插入图片描述

这个跟上个题非常的类似,要求都是一样的,就是实现的思想不太一样,栈是要求后进先出,我们如何用两个栈实现先入先出呢?比如说:
我们先给一个栈中放上五个数据
在这里插入图片描述
我们现在要取出栈一当中的1,无可厚非,也是倒数据嘛对不对,先把2,3,4,5倒到栈二,再把一取出就可以了。
在这里插入图片描述
如果现在我们要取出2呢?好像这次不用倒了,直接取就行。我要插入数据呢?得插到栈一,因为插到栈二数据就乱了,栈二的数据取出完了就把栈一的数据倒到栈二,依次类推,就可以得到一个队列了。不知道你有没有发现,栈一只需要插入数据,栈二只需要取出数据。
总结:一个栈负责插入数据,一个栈负责出数据,出数据的栈没了数据就从插入数据的栈中倒过来。

typedef struct {
ST push;
ST pop;
} MyQueue;MyQueue* myQueueCreate() {
MyQueue*tmp=(MyQueue*)malloc(sizeof(MyQueue));
STInit(&tmp->push);
STInit(&tmp->pop);
return tmp;
}void myQueuePush(MyQueue* obj, int x) {
STPush(&obj->push,x);
}int myQueuePeek(MyQueue* obj) {if(!STEmpty(&obj->pop)){return STTop(&obj->pop);}
while(!STEmpty(&obj->push)){//倒数据STDataType tmp=STTop(&obj->push);STPop(&obj->push);STPush(&obj->pop,tmp);
}return STTop(&obj->pop);
}int myQueuePop(MyQueue* obj) {
myQueuePeek(obj);
STDataType tmp=STTop(&obj->pop);STPop(&obj->pop);
return tmp;
}bool myQueueEmpty(MyQueue* obj) {
return STEmpty(&obj->pop)&&STEmpty(&obj->push);
}void myQueueFree(MyQueue* obj) {
STDestroy(&obj->pop);
STDestroy(&obj->push);
free(obj);
}

同理,这个也是需要栈的代码的,链接在上面

设计循环队列

链接:设计循环队列
在这里插入图片描述

什么叫循环队列呢?就是说一个队列的长度是一定的,只要有空间我们要一直从尾插入,头出,即使这个尾在头的前面。这个循环队列用数组来实现是非常理想的,我们还可以多开辟一个空间来区分空和满。
我们还是画图来解释一下
在这里插入图片描述
比如说我们开辟一个六个空间的数组,一开始头和尾都在开头位置,我们要插入的话要在tail的位置插入,并且tail要走向后一个
在这里插入图片描述
比如说我们插入五个数据,这时就满了,因为我们如果要插入6个数据的话,空和满不能区分,head都是等于tail,但现在tail的下一个为head就证明满了,如果要出的话也简单
在这里插入图片描述
这是再插入就要在返回数组的前边插入了,具体代码实现就是取余
在这里插入图片描述
这样就实现了循环功能

typedef struct {
int*a ;
int head;
int tail;
int size;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue*tmp=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
tmp->a=(int*)malloc(sizeof(int)*(k+1));
tmp->head=0;
tmp->tail=0;
tmp->size=k+1;
return tmp;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if((obj->tail+1)%obj->size==obj->head){return false;
}
else{obj->a[obj->tail]=value;obj->tail=(obj->tail+1)%(obj->size);return true;
}
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if(obj->head==obj->tail){return false;
}
else{obj->head=(obj->head+1)%(obj->size);return true;
}
}int myCircularQueueFront(MyCircularQueue* obj) {
if(obj->head==obj->tail){return -1;
}
else{return obj->a[obj->head];
}
}int myCircularQueueRear(MyCircularQueue* obj) {
if(obj->head==obj->tail){return -1;
}
else{return obj->a[(obj->tail+obj->size-1)%obj->size];
}
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return obj->head==obj->tail;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {
return (obj->tail+1)%obj->size==obj->head;
}void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->a);
free(obj);
}

中间有很多的取余操作,目的就是找到逻辑上的下一个位置,但在物理上它确实是在前面。

相关文章:

OJ第五篇

文章目录 用队列实现栈用栈实现队列设计循环队列 用队列实现栈 链接:用队列实现栈 这道题是让我们用两个队列实现一个栈,简单来说,就是利用队列来实现一个先入后出的功能,我们知道队列是先入先出,如何用两个队列来实…...

【论文解读】Parameter-Efficient Transfer Learning for NLP

一. 介绍 1.1 为什么要引入Adapter 在存在许多下游任务的情况下,微调的参数效率很低:每个任务都需要一个全新的模型。作为替代方案,我们建议使用适配器模块进行传输。 1.2 论文目标 目标是建立一个在所有这些方面都表现良好的系统,但不需…...

星途星纪元 ES,用艺术思维表达工程技术

10月8日,星途星纪元ES携手世界级成都爱乐首席乐团、旅德青年钢琴家王超,在成都打造了一场“万物星声”超舒适音乐会视听盛宴。这是星途星纪元首次跨界音乐圈、牵手音乐挚友,共同演绎音乐和汽车的美学协奏曲,开启高端超舒适美学新纪…...

【Java 进阶篇】深入了解 Bootstrap 插件

Bootstrap 是一个流行的前端框架,提供了各种强大的插件,用于增强网页和应用程序的功能和交互性。本篇博客将深入介绍 Bootstrap 插件,适用于那些刚刚开始学习前端开发的小白。 什么是 Bootstrap? 在深入探讨 Bootstrap 插件之前…...

VMware17.0安装教程(2023最新最详细)

目录 一.简介 二.安装步骤 软件:VMware版本:17.0语言:简体中文大小:554.98M安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.6GHz 内存4G(或更高)下载通道①百度网盘丨下载链接: htt…...

k8s----11、service

services 1、概述2、存在的意义2.1 服务发现2.2 负载均衡 3、pod与service的关系4、service 三种类型4.1 、 ClusterIP4.2 、NodePort4.3 、LoadBalancer 1、概述 Service 是 Kubernetes 最核心概念,通过创建 Service,可以为一组具有相同功能的容器应 用提供一个统…...

深入篇【Linux】学习必备:进程环境变量/进程切换

深入篇【Linux】学习必备:进程环境变量/进程切换 Ⅰ.环境变量Ⅱ.深层意义Ⅲ.全局属性Ⅳ.进程切换 Ⅰ.环境变量 1.环境变量是什么?:环境变量是系统提供的一组name/value形式的变量,不同的环境变量有不同的用户。 一般是用来指定操作…...

文件系统相关

文件系统部分的大纲要求: 文件系统的全局结构:文件系统在外存中的结构,文件系统在内存中的结构外存空闲空间管理办法虚拟文件系统文件系统挂载 一、文件系统的层次结构 可分为三个层次:最低层是对象及其属性,中间层…...

edm邮件开发信模板

现在很多从事外贸的工作人员在寻找一些邮件模板,今天一米软件给大家总结了几套常用的开发新客户的邮件模板 开发新模板1: Hi Sir, Glad to hear that youre on the market for **. We specialize in this field for several years, with the strengt…...

边缘服务器的未来是什么?思考 5G 和 AI 需求

什么是边缘服务器 边缘服务器是一种分布式计算模式,旨在提高数据中心和云服务的效率,并解决设备之间通信的延迟问题。它将业务从中央数据中心转移到边缘设备附近,将计算、存储和网络资源靠近终端用户和设备,以实现更快速的数据处…...

老卫带你学---leetcode刷题(438. 找到字符串中所有字母异位词)

438. 找到字符串中所有字母异位词 问题: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 …...

unity中使用protobuf工具将proto文件转为C#实体脚本

unity中使用protobuf工具将proto文件转为C#实体脚本 介绍优点缺点Protobuf 为什么比 XML 快得多?Protobuf的EncodingProtobuf封解包的过程通常编写一个Google Protocol Buffer应用需要以下几步: Protostuff是什么Protobuf工具总结 介绍 protobuf也就是G…...

1024程序员狂欢节有好礼 | 前沿技术、人工智能、集成电路科学与芯片技术、新一代信息与通信技术、网络空间安全技术

🌹欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 1024程序员狂欢节有好礼 🚩🚩🚩点击直达福利前言一、IT技术 IT Technology《速学Linux:系统应用从入门到精通》《Pytho…...

常用Web安全扫描工具合集

漏洞扫描是一种安全检测行为,更是一类重要的网络安全技术,它能够有效提高网络的安全性,而且漏洞扫描属于主动的防范措施,可以很好地避免黑客攻击行为,做到防患于未然。那么好用的漏洞扫描工具有哪些? 1、A…...

Zoho Mail荣登福布斯小型企业企业邮箱排行榜

在过去的数十载里,电子邮件已成为电子通信领域中不可或缺的一环,而在未来的岁月里,它有望继续在全球范围内普及应用。尽管如今市场上有许多免费的企业邮箱供用户和企业选用,但其中许多产品在特定场景下的专业化功能尚显不足&#…...

Cave Cows 3

题目描述 约翰的 N (1≤N≤50000 )只牛在一个黑魃魃的洞里探险,他们只能通过叫声交流。 两只牛之间的曼哈顿距离决定了声音传播的时间。即牛1与牛2交流,需要的时间为 ∣x1​−x2​∣∣y1​−y2​∣ 。其中 −2≤106−106≤x1​,x2​,y1​,y2​≤106 。…...

Java程序设计2023-第四次上机练习

8-1三子棋 编写程序,实现简单的三子棋游戏。在三子棋中,双方在33的棋盘中轮流下棋,一方用*示,另一方用O表示。如果一方的3个棋子占据了同一行,同一列或者对角线,则该方获胜。如果棋盘已被棋子占满&#xf…...

nonaDlA 逻辑分析仪 使用记录

注意事项,很灵敏,不要用手碰,产生误触发 安装软件 github地址 官方提供的淘宝地址与使用说明 1.安装 1.安装程序 :下载githubDLA源码,打开 software\PulseView.exe安装 2.安装驱动:安装完第一步后&a…...

用HFSS仿真平面线圈的电感量

用HFSS工具仿真平面线圈的电感量 平面线圈是指在平面上绕制而成的线圈,如PCB上的电感线圈、无线供电使用的金属丝绕制而成的线圈等。根据线圈的不同形状可将平面线圈分为方形线圈,六角形线圈、八角形线圈、螺旋原型线圈等。 网络上的计算平面线圈电感量…...

字节面试题——数据库, linux

数据库 1.sq|语句取-一个月内的id分组取-一个年级中每个班级年龄最小的同学名字成绩表输出前三名的 成绩,后三名呢拷贝A表的数据到B表查询每1 ]科目都大于80分的学生名字筛选出每个小时 的记录考察where考察聚合函数where和having的区别-一个数据库sq|查询重复个数…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...