OJ第五篇

news2024/11/16 15:50:09

文章目录

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

用队列实现栈

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

这道题是让我们用两个队列实现一个栈,简单来说,就是利用队列来实现一个先入后出的功能,我们知道队列是先入先出,如何用两个队列来实现后入先出呢?比如说,
我们现在有五个数据进入了第一个队列
在这里插入图片描述
之后我们如果要按照栈的形式取出数据的话,要取出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);
}

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

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

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

相关文章

Vue2基础知识(四) 自定义指令

目录 一 自定义指令1.1 定义1.2 自定义局部指令1.3 全局注册指令1.4 钩子函数1.5 动态传参1.6 使用场景 💌 所属专栏:【Vue2】😀 作 者:长安不及十里💻工作:目前从事电力行业开发🌈目标&#xf…

全国342个城市往返最短通勤时间(铁路)数据

全国342个城市往返最短通勤时间(铁路)数据 1、时间:采集时间是2022年 2、来源:12306 3、数据说明:数据采集12306数据,整理全国342个城市往返最短通勤时间,本数据是铁路包含动车、高铁所有路线…

【GESP】2023年06月图形化三级 -- 计算最终值

文章目录 计算最终值【题目描述】【输入描述】【输出描述】【参考答案】其他测试用例 计算最终值 【题目描述】 默认小猫角色,白色背景。存在一种仅支持2种操作和1个变量的编程语言: X 使变量 “X” 的值增加1X-- 使变量 “X” 的值减少 1 最初&#…

基于SAE堆叠自编码器的单维时间序列预测研究(matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

在没有康托尔对角化方法的情况下证明实数的不可数性

乔治康托尔 |图片来源: 维基百科 一、说明 对于那些对数学感兴趣的人来说,无穷大实际上可以有不同的大小,这可能是一个众所周知的事实。事实上,最著名的例子是所有实数的集合比所有自然数的集合“大”。你可能知道,这实…

Docker部署SpringBoot +Vue项目流程详解(含域名 + HTTPS)

文章目录 前言1、选购服务器2、部署 Docker3、前端、后端项目打包4、配置 Dockerfile5、配置 Nginx6、配置 DockerCompose6、启动 DockerCompose 完成部署7、【可选】域名 SSL证书 前言 本次整体部署操作使用阿里云服务器,这里我选择的是香港地区的2核2G ECS&…

打击勒索病毒:防御.kat6.l6st6r勒索病毒的最佳策略

导言: 我们日常生活和工作的方方面面都离不开数字化,但这也意味着面临日益复杂的网络威胁。.kat6.l6st6r勒索病毒就是其中之一,如果你的计算机感染了这种恶意软件,你的数据可能会遭到加密并要求支付赎金才能解锁。在这篇终极指南…

STM32F4_音乐播放器

目录 前言 1. WAV简介 1.1 WAVE文件的内部结构 2. WM8978简介 3. I2S简介 4. 硬件设计 5. 实验程序 5.1 main.c 5.2 I2S.c 5.3 I2S.h 5.4 WM8978.c 5.5 WM8978.h 前言 STM32F4开发板拥有全双工I2S(也就是可以同时双向进行传输,A到B传输信息的…

强化学习问题(7)--- Python和Pytorch,Tensorflow的版本对应

1.问题 之前下载的python3.8,在对应Pytorch和Tensorflow时没太在意版本,在运行一些代码时,提示Pytorch和Tensorflow版本过高,直接降下来,有时候又和Python3.8不兼容,所以又在虚拟环境搞一个Pyhon3.7&#x…

Brachistochrone:使用变分法找到最快下降曲线

一、说明 对于任何对数学和科学感兴趣的人,您可能已经知道了急速线,因为它经常在各种流行的教学频道(例如 Vsauce 和 3Blue1Brown)上谈论。虽然有多种方法可以解决急速线问题,但在这篇文章中,本文将使用变分…

【C++】哈希应用——海量数据面试题

哈希应用——海量数据面试题 一、位图应用1、给定100亿个整数,设计算法找到只出现一次的整数?2、给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?(1)用一个位图…

Mac安装nginx(Homebrew)

查看需要安装 nginx 的信息 brew info nginxDocroot 默认为 /usr/local/var/www 在 /opt/homebrew/etc/nginx/nginx.conf 配置文件中默认端口被配置为8080,从而使 nginx 运行时不需要加 sudo nginx将在 /opt/homebrew//etc/nginx/servers/ 目录中加载所有文件 …

Springboot+vue的学生考勤管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的学生考勤管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的学生考勤管理系统,采用M(model&a…

Gin框架--参数接收函数

1.get 请求 穿参数 #根据返回的bool 判断是否正确传值 _p, err : c.GetQuery("pkg") if !err {p.ReError(c, http.StatusBadRequest, "params pkg empty", "")return} #默认值接收方法_p : c.DefaultQuery("pkg", "hmf") …

【java计算机毕设】高校奖学金管理系统 java springmvc vue mysql 送文档+ppt

目录 1.项目功能截图 2.项目简介 3.源码下载地址 1.项目功能截图 2.项目简介 ssm奖学金系统 医院系统 idea mysql5.7/8 tomcat8 html jdk1.8 奖学金管理系统。基于SpringBootVue框架开发,方便学生直观得查看学校奖学金的评选时间、评选资格和评选内容&#xff0…

C语言学习系列->动态内存管理

文章目录 前言概述🚩malloc and free🔜malloc🔜free 🚩calloc and realloc🔜calloc🔜realloc 前言 要想学好数据结构,在C语言学习过程中就需要把指针、结构体和动态内存管理学好。在前面的文章&…

2006-2019年全国30省绿色创新效率、绿色投资效率:基于SBM-DEA测算面板数据(数据+Stata代码)

1、来源:各省年鉴、统计局、科技年鉴 2、时间:2006-2019 3、范围:全国 30 个省份 4、指标: 原始数据指标:R&D 全时人员当量 (万人年)、R&D 资本存量 (亿元;利用以 1999 年为初期永续存量法&a…

css之Flex弹性布局(父项常见属性)

文章目录 🐕前言:🏨定义flex容器 display:flex🏨在flex容器中子组件进行排列🪂行排列 flex-direction: row🪂将行排列进行翻转排列 flex-direction: row-reverse🏅按列排列 flex-direction: col…

postman自动化运行接口测试用例

做过接口测试的人,应该都知道postman ,我们在日常的时候都可以利用postman做接口测试,我们可以把接口的case保存下来在collection里面,那么可能会有这样的需求,我们怎么把collection的用例放到jenkins中定时执行呢&…

C++STL的迭代器(iterator)

一、定义 迭代器是一种检查容器内元素并且遍历容器内元素的数据类型。 【引用自:C迭代器(iterator)_c iterator_NiUoW的博客-CSDN博客】迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。C更趋向于使用迭代器而不是数组下…