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

力扣刷题:栈和队列OJ篇(上)

大家好,这里是小编的博客频道
小编的博客:就爱学编程

很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!

目录

  • 1.用队列实现栈
    • (1)题目描述
    • (2)解题思路
  • 2.用两个栈实现队列
    • (1)题目描述
    • (2)解题思路
  • 快乐的时光总是短暂,咱们下篇博文再见啦!!!如果小编的文章会对你有帮助的话不要忘了,记得给小编点赞、收藏支持一下,在此非常感谢!!!

在这里插入图片描述


废话不多说,我们直接看题。

1.用队列实现栈

(1)题目描述

在这里插入图片描述

在这里插入图片描述


(2)解题思路

  • 为了满足栈的特性,即最后入栈的元素最先出栈,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素。可以使用两个队列实现栈的操作,其中queue 1​ 用于存储栈内的元素,queue 2 作为入栈操作的辅助队列。
  • 入栈操作时,首先将元素入队到queue 2,然后将 queue 1 的全部元素依次出队并入队到 queue 2 ,此时 queue 2 的前端的元素即为新入栈的元素,再将queue 1 queue 2互换,则 queue 1 的元素即为栈内的元素,queue 1的前端和后端分别对应栈顶和栈底。由于每次入栈操作都确保 queue 1 的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除 queue 1 的前端元素并返回即可,获得栈顶元素操作只需要获得queue 1 的前端元素并返回即可(不移除元素)。由于 queue 1 用于存储栈内的元素,判断栈是否为空时,只需要判断 queue 1 是否为空即可。

代码实现:

typedef int QDatatype;
typedef struct QuequeNode {QDatatype data;struct QuequeNode* next;
}QNode;
typedef struct Queue{QNode* head;			//单链表的头指针作为队头QNode* tail;			//单链表的尾指针作为队尾int size;				//存储队列元素数量
}Que;//初始化队列
void QInit(Que* ps) {assert(ps);ps->head = ps->tail = NULL;ps->size = 0;
}//销毁队列
void QDestroy(Que* ps) {assert(ps);QNode* cur = ps->head;while (cur) {QNode* next = cur->next;free(cur);cur = next;}ps->size = 0;ps->head = ps->tail = NULL;
}//插入数据(从队尾)------入队
void QPush(Que* ps, QDatatype x) {assert(ps);QNode* cur = (QNode*)malloc(sizeof(QNode));if (cur == NULL) {perror("malloc fail");return;}if (ps->head == NULL) {assert(ps->tail == NULL);ps->head = ps->tail = cur;}else {ps->tail->next = cur;		//先赋值ps->tail = cur;				//再更新尾指针}cur->next = NULL;cur->data = x;ps->size++;
}//判空
bool QEmpty(Que* ps) {assert(ps);return (ps->size == 0);
}//删除数据(从对头)------出队
void QPop(Que* ps) {assert(ps);assert(!QEmpty(ps));if (ps->head->next == NULL) {free(ps->head);ps->head = ps->tail = NULL;ps->size = 0;return;}QNode* next = ps->head->next;free(ps->head);ps->head = next;ps->size--;
}//得出队内元素数量
int QSize(Que* ps) {assert(ps);return (ps->size);
}//得到队头元素的数据
QDatatype QFront(Que* ps) {assert(ps && !QEmpty(ps));return (ps->head->data);
}//得到队尾元素的数据
QDatatype QBack(Que* ps) {assert(ps && !QEmpty(ps));return (ps->tail->data);
}typedef struct {Que q1;Que q2;
} MyStack;MyStack* myStackCreate() {MyStack* ptr = (MyStack*)malloc(sizeof(MyStack));if(ptr == NULL){perror("malloc fail");return NULL;}QInit(&ptr->q1);QInit(&ptr->q2);return ptr;
}void myStackPush(MyStack* obj, int x) {if(QEmpty(&obj->q1)){QPush(&obj->q2, x);}else{QPush(&obj->q1, x);}
}int myStackPop(MyStack* obj) {if(QEmpty(&obj->q1)){while(QSize(&obj->q2) > 1){QDatatype temp = QFront(&obj->q2);QPop(&obj->q2);QPush(&obj->q1, temp);}QDatatype top =  QBack(&obj->q2);QPop(&obj->q2);return top;}else{while(QSize(&obj->q1) > 1){QDatatype temp = QFront(&obj->q1);QPop(&obj->q1);QPush(&obj->q2, temp);}QDatatype top =  QBack(&obj->q1);QPop(&obj->q1);return top;}
}int myStackTop(MyStack* obj) {if(QEmpty(&obj->q1)){return QBack(&obj->q2);}return QBack(&obj->q1);
}bool myStackEmpty(MyStack* obj) {return QEmpty(&obj->q1) && QEmpty(&obj->q2);
}void myStackFree(MyStack* obj) {QDestroy(&obj->q1);QDestroy(&obj->q2);free(obj);obj = NULL;
}

2.用两个栈实现队列

(1)题目描述

在这里插入图片描述
在这里插入图片描述


(2)解题思路

  • 将一个栈当作输入栈,用于压入 push 传入的数据;另一个栈当作输出栈,用于 pop 和 peek 操作。
  • 每次poppeek时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。

代码实现:

#define MAXCAPACITY 4typedef int Datastyle;typedef struct stack {Datastyle* a;               int top;int capacity;
}ST;//初始化栈
void STInit(ST* ps) {assert(ps);Datastyle* temp = (Datastyle*)malloc(MAXCAPACITY * sizeof(Datastyle));if (temp == NULL) {perror("malloc fail");exit(-1);}ps->a = temp;ps->capacity = MAXCAPACITY;ps->top = 0;
}//销毁栈
void  STDestory(ST* ps){assert(ps);free(ps->a);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}//插入数据(从栈顶)----(入栈,压栈)
void STPush(ST* ps, Datastyle x) {assert(ps);//判断是否满了if (ps->top == ps->capacity) {Datastyle* temp = (Datastyle*)realloc(ps->a, 2 * ps->capacity * sizeof(Datastyle));				//扩容为当前容量的两倍比较合理if (temp == NULL) {perror("realloc fail");return;}ps->capacity *= 2;ps->a = temp;}ps->a[ps->top++] = x;
}//判空
bool STEmpty(ST* ps) {return (ps->top == 0);
}//删除数据(从栈顶)----(出栈)
void STPop(ST* ps) {assert(ps && !STEmpty(ps));--ps->top;
}//访问栈顶元素
Datastyle STTop(ST* ps) {return ps->a[ps->top - 1];
}//得出栈的元素个数
int STSize(ST* ps) {assert(ps);return ps->top;
}typedef struct {ST stpush;                 //stpush专门用来存储数据,只有在stpop为空时进行出数据至st2ST stpop;                 //stpop专门用来出数据,只有当其为空时从stpush拿出数据进行存储
} MyQueue;MyQueue* myQueueCreate() {MyQueue* ptr = (MyQueue*) malloc(sizeof(MyQueue));if(ptr == NULL){perror("malloc fail");return NULL;}STInit(&ptr->stpush);STInit(&ptr->stpop);return ptr;
}void myQueuePush(MyQueue* obj, int x) {STPush(&obj->stpush, x);
}int myQueuePop(MyQueue* obj) {if(STEmpty(&obj->stpop)){while(!STEmpty(&obj->stpush)){Datastyle temp = STTop(&obj->stpush);STPop(&obj->stpush);STPush(&obj->stpop, temp);}}Datastyle top =  STTop(&obj->stpop);STPop(&obj->stpop);return top;
}int myQueuePeek(MyQueue* obj) {if(STEmpty(&obj->stpop)){while(!STEmpty(&obj->stpush)){Datastyle temp = STTop(&obj->stpush);STPop(&obj->stpush);STPush(&obj->stpop, temp);}}return STTop(&obj->stpop);
}bool myQueueEmpty(MyQueue* obj) {return STEmpty(&obj->stpush) && STEmpty(&obj->stpop);
}void myQueueFree(MyQueue* obj) {STDestory(&obj->stpush);STDestory(&obj->stpop);free(obj);obj = NULL;
}

快乐的时光总是短暂,咱们下篇博文再见啦!!!如果小编的文章会对你有帮助的话不要忘了,记得给小编点赞、收藏支持一下,在此非常感谢!!!

相关文章:

力扣刷题:栈和队列OJ篇(上)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 目录 1.用队列实现栈(1)题目…...

XGPT用户帮助手册

文章目录 2024 更新日志2024.12.272024.12.29 摘要 本文详细介绍了XGPT软件的功能及发展历程。XGPT是一款融合了当前最先进人工智能技术的多模态智能软件,专为国内用户优化设计。除了强大的智能问答功能外,XGPT还结合日常办公和科学研究的需求&#xff0…...

Oracle 数据库 dmp文件从高版本导入低版本的问题处理

当前有个需求是将oracle 19c上的数据备份恢复到oracle 11g上使用。我们通过exp命令远程进行备份,然后通过imp进行恢复时出现IMP-00010: not a valid export file, header failed verification报错。 这是数据库版本问题,在使用exp命令导出的时候使用的客…...

ShardingSphere-Proxy分表场景测试案例

快速入门文章参考:《ShardingSphereProxy:快速入门》 基于K8S部署文章参考:《基于K8s部署ShardingSphere-Proxy》 基于golang的测试用例参考:《ShardingSphere-Proxy 连接实战:从 Golang 原生 SQL 到 GORM 的应用》 背景 我们…...

学技术学英文:Tomcat的线程模型调优

导读: tomcat 线程调优关键需要理解下面这几个参数: 1. maxConnections 描述:指定服务器能够同时接受和处理的最大连接数。也就是说,服务器在任何时候都能处理的最大并发连接数。作用:限制服务器在任何给定时间点能…...

创建flutter项目遇到无法连接源的问题

Flutter 环境信息 Flutter版本: 3.19.4 (channel stable) Framework: revision 68bfaea224 (2024-03-20) Engine: revision a5c24f538d Dart: 3.3.2 DevTools: 2.31.1 项目基本信息 项目路径: D:\F\luichun 域名: www.luichun.com.cn 支持平台: android, web, windows 项目创…...

MAC系统QT图标踩坑记录

MAC系统QT图标踩坑记录 1. 准备图标1.1 方法一:下载准备好的图标1.2 方法二:自己生成图标1.2.1 准备一个png文件1.2.2 用sips生成不同大小的图片1.2.3 用iconutil生成图标文件 2. 配置图标2.1. 把图标改命成自己想要的名字,如icon.icns&#…...

TF-IDF(Term Frequency-Inverse Document Frequency)详解:原理和python实现(中英双语)

中文版 TF-IDF算法详解:理解与应用 TF-IDF(Term Frequency-Inverse Document Frequency)是信息检索与文本挖掘中常用的算法,广泛应用于搜索引擎、推荐系统以及各种文本分析领域。TF-IDF的核心思想是通过计算一个词在文档中的重要…...

【竞技宝】CS2:HLTV2024职业选手排名TOP15-xantares

北京时间2024年12月30日,HLTV年度选手排名正在持续公布中,今日凌晨正式公布了今年的TOP15选手为EternalFire战队的xantares选手。 选手简介 xantares是一名来自于土耳其的CS职业选手,出生于1995年,今年已经29岁。早在2012年&…...

Spring-kafka快速Demo示例

使用Spring-Kafka快速发送/接受Kafka消息示例代码&#xff0c;项目结构是最基础的SpringBoot结构&#xff0c;提前安装好Kafka&#xff0c;确保Kafka已经正确启动 pom.xml&#xff0c;根据个人情况更换springboot、java版本等 <?xml version"1.0" encoding&qu…...

客户案例:基于慧集通集成平台,打通屠宰管理系统与用友U8C 系统的全攻略

一、引言 本原型客户成立于2014年&#xff0c;是一家集饲草种植、肉牛养殖、精深加工、冷链物流、餐饮服务于一体的大型农牧综合体。公司下设三个子公司分别涵盖农业、畜牧业、肉制品加工业与餐饮物流服务业。公司严格按照一二三产业融合发展要求&#xff0c;以肉牛产业化为支…...

模型 九屏幕分析法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。九屏幕法&#xff1a;全方位分析问题的系统工具。 1 九屏幕分析法的应用 1.1 新产品研发的市场分析 一家科技公司计划开发一款新型智能手机&#xff0c;为了全面评估市场潜力和风险&#xff0c;他们…...

Qanything 2.0源码解析系列6 PDF解析逻辑

Qanything 2.0源码解析系列6: PDF解析逻辑 type: Post status: Published date: 2024/12/04 summary: 深入剖析Qanything是如何拆解PDF的,核心是pdf转markdown category: 技术分享 原文:www.feifeixu.top 😀 前言: 在前面的文章中探究了图片是怎么进行解析的,这篇文章对…...

MAC系统QT Creator的快捷键

安装好QT Creator后使用了一段时间&#xff0c;真是越用越难受&#xff0c;只想说&#x1f5d1;️。。。 找一圈qt creator的快捷键 0. 快捷键界面 这里的搜索真的是…无语&#xff0c;不考虑是人查找吗&#xff1f;&#xff1f; 1. 代码前后浏览 2. 移动代码 3. 半自动导入…...

【深度学习】多目标融合算法—样本Loss提权

目录 一、引言 二、样本Loss提权 2.1 技术原理 2.2 技术优缺点 三、总结 一、引言 在朴素的深度学习ctr预估模型中&#xff08;如DNN&#xff09;&#xff0c;通常以一个行为为预估目标&#xff0c;比如通过ctr预估点击率。但实际推荐系统业务场景中&#xff0c;更多是多…...

C 实现植物大战僵尸(四)

C 实现植物大战僵尸&#xff08;四&#xff09; C 实现植物大战僵尸&#xff0c;完结撒花&#xff08;还有个音频稍卡顿的性能问题&#xff0c;待有空优化解决&#xff09;。目前基本的功能模块已经搭建好了&#xff0c;感兴趣的友友可自行尝试编写后续游戏内容 因为 C 站不能…...

Tailwind CSS:现代 CSS 框架的优雅之选

Tailwind CSS&#xff1a;现代 CSS 框架的优雅之选 在现代前端开发中&#xff0c;CSS 的灵活性和复杂性让开发者在设计与实现之间寻找平衡。而 Tailwind CSS 的出现&#xff0c;重新定义了 CSS 框架的使用方式。它是一种原子化的 CSS 工具库&#xff0c;提供了丰富的类名以快速…...

MyBatis 使用的设计模式详解

MyBatis 是一个优秀的持久层框架&#xff0c;它简化了 Java 应用程序与数据库之间的交互。为了实现高效、灵活且易于维护的代码&#xff0c;MyBatis 内部使用了多种设计模式。本文将详细介绍 MyBatis 中应用到的设计模式及其作用。 工厂模式&#xff08;Factory Pattern&#x…...

LabVIEW 中 NI Vision 模块的IMAQ Create VI

IMAQ Create VI 是 LabVIEW 中 NI Vision 模块&#xff08;NI Vision Development Module&#xff09;的一个常用 VI&#xff0c;用于创建一个图像变量。该图像变量可以存储和操作图像数据&#xff0c;是图像处理任务的基础。 ​ 通过以上操作&#xff0c;IMAQ Create VI 是构建…...

2024 年度总结

时光荏苒&#xff0c;2024 年即将画上句号&#xff0c;回顾这一年的写博历程&#xff0c;有付出、有收获、有成长&#xff0c;也有诸多值得回味与反思的瞬间。 一、内容创作 主题涉猎&#xff1a;这一年&#xff0c;我致力于探索多样化的主题&#xff0c;以满足不同读者群体的…...

STM32 高级 物联网通讯之LoRa通讯

目录 LoRa通讯基础知识 常见的3种通讯协议 远距离高速率的传输协议 近距离高速率传输技术 近距离低功耗传输技术 低功耗广域网 采用授权频段技术 非授权频段 LoRa简介 LoRa的特点 远距离 低功耗 安全 标准化 地理定位 移动性 高性能 低成本 LoRa应用 LoRa组…...

【笔记】在虚拟机中通过apache2给一个主机上配置多个web服务器

&#xff08;配置出来的web服务器又叫虚拟主机……&#xff09; 下载apache2 sudo apt update sudo apt install apache2 &#xff08;一&#xff09;ip相同 web端口不同的web服务器 进入 /var/www/html 创建站点一和站点二的目录文件&#xff08;目录文件名自定义哈&#x…...

数据库的创建与删除:理论与实践

title: 数据库的创建与删除:理论与实践 date: 2024/12/31 updated: 2024/12/31 author: cmdragon excerpt: 在当今的数字时代,数据的管理和存储变得尤为重要。数据库作为数据存储的结构化方案,为数据的增删改查提供了系统化的方法。在一个典型的数据库管理系统中,创建和…...

如何解决Eigen和CUDA版本不匹配引起的错误math_functions.hpp: No such file or directory

Apollo9针对RTX40的docker环境里的Eigen库版本是3.3.4&#xff0c;CUDA是11.8: 编译我们自己封装模型的某些component代码时没问题&#xff0c;编译一个封装occ模型的component代码时始终报错: In file included from /usr/include/eigen3/Eigen/Geometry:11:0, …...

Mybatis 01

JDBC回顾 select 语句 "select *from student" 演示&#xff1a; 驱动包 JDBC 的操作流程&#xff1a; 1. 创建数据库连接池 DataSource 2. 通过 DataSource 获取数据库连接 Connection 3. 编写要执⾏带 ? 占位符的 SQL 语句 4. 通过 Connection 及 SQL 创建…...

前端页面展示本电脑的摄像头,并使用js获取摄像头列表

可以通过 JavaScript 使用 navigator.mediaDevices.enumerateDevices() 获取电脑上的摄像头列表。以下是一个示例代码&#xff0c;可以展示摄像头列表并选择进行预览。 HTML JavaScript 实现摄像头列表展示和预览 <!DOCTYPE html> <html lang"zh-CN">…...

HTML5实现喜庆的新年快乐网页源码

HTML5实现喜庆的新年快乐网页源码 前言一、设计来源1.1 主界面1.2 关于新年界面1.3 新年庆祝活动界面1.4 新年活动组织界面1.5 新年祝福订阅界面1.6 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现喜庆的新年快乐网页源码&#xff0c;春节新年网…...

Excel文件恢复教程:快速找回丢失数据!

Excel文件恢复位置在哪里&#xff1f; Excel是微软开发的电子表格软件&#xff0c;它为处理数据和组织工作提供了便捷。虽然数据丢失的问题在数字时代已经司空见惯&#xff0c;但对于某些用户来说&#xff0c;恢复未保存/删除/丢失的Excel文件可能会很困难&#xff0c;更不用说…...

计算机网络-L2TP Over IPSec基础实验

一、概述 上次我们进行了标准L2TP的配置&#xff0c;但是在最后我们在进行业务流量访问时看到流量是没有进行加密的&#xff0c;这就导致可能得安全风险&#xff0c;所以这里其实可以退像GRE那样调用IPSec框架来进行加密保护。 拓扑 数据不加密 现在需要配置IPSec&#xff0c;然…...

一个最简单的ios程序(object_c)的编写

前言 如何在苹果系统MacOS创建一个简单的ios&#xff08;iphone&#xff09;程序&#xff0c;貌似非常的简单。但是&#xff0c;作为习惯了Windows开发的程序员来说&#xff0c;有时候还觉得有点麻烦&#xff0c;至少开始有点很不习惯。 本博文试着把这个过程展现一下&#xff…...