【LeetCode】栈和队列OJ题---C语言版

栈和队列OJ题

  • 1.括号匹配问题
    • (1)题目描述:
    • (2)思路表述:
    • (3)代码实现:
  • 2.用队列实现栈
    • (1)题目描述:
    • (2)思路表述:
    • (3)代码实现:
  • 3.用栈实现队列
    • (1)题目描述:
    • (2)思路表述:
    • (3)代码实现:

1.括号匹配问题

(1)题目描述:

点击链接
在这里插入图片描述

(2)思路表述:

解题思路:该题比较简单,是对栈特性很好的应用,具体操作如下:循环遍历String中的字符,逐个取到每个括号,如果该括号是:1. 左括号,直接入栈2. 右括号,与栈顶的左括号进行匹配,如果不匹配直接返回false否则继续循环循环结束后,如果栈空则匹配,否则左括号比右括号多肯定不匹配

(3)代码实现:

bool isValid(char * s){// oj题目给的提示:1 <= s.length <= 104  说明s中一定是有字符串的  不考虑空串或者s为空的情况int size = strlen(s);Stack st;StackInit(&st);bool isMatch = true;for(int i = 0; i < size; ++i){// 如果是左括号则入栈if(('(' == s[i]) || ('[' == s[i]) || ('{' == s[i])){StackPush(&st, s[i]);}else{// 拿到的是右括号// 此时: 需要从栈顶获取左括号来检测是否匹配// 注意:一定要保证栈中有元素才可以获取栈顶元素if(StackEmpty(&st)){//StackDestroy(&st);//return false;isMatch = false;break;}char top = StackTop(&st);if((top == '(' && s[i] == ')') ||(top == '[' && s[i] == ']') ||(top == '{' && s[i] == '}')){StackPop(&st);}else{// 没有匹配// StackDestroy(&st);// return false;isMatch = false;break;}}}// 如果完全匹配,则循环结束时,栈一定是空的// 否则说明:左括号比右括号多if(!StackEmpty(&st)){//StackDestroy(&st);//return false;isMatch = false;}StackDestroy(&st);return isMatch;
}

2.用队列实现栈

(1)题目描述:

点击链接
在这里插入图片描述

(2)思路表述:

解题思路:
此题可以用两个队列去实现一个栈,每次始终保持一个队列为空,
入栈操作相当于给非空队列进行入队操作
出栈操作相当于非空队列的队尾元素出队,此时需要把非空队列除最后一个元素之外的其余元素入队到空队列,然后出队最后一个队尾元素

在这里插入图片描述

(3)代码实现:

typedef struct {Queue q1;Queue q2;} MyStack;/** Initialize your data structure here. */
MyStack* myStackCreate(int maxSize) {MyStack* pst = (MyStack*)malloc(sizeof(MyStack));QueueInit(&pst->q1);QueueInit(&pst->q2);return pst;
}/** Push element x onto stack. */
void myStackPush(MyStack* obj, int x) {//给非空队列进行入队操作if(QueueEmpty(&obj->q1) != 0){QueuePush(&obj->q1, x);}else{QueuePush(&obj->q2, x);}
}/** Removes the element on top of the stack and returns that element. */
int myStackPop(MyStack* obj) {//把非空队列的除最后一个元素之外的剩余元素全部入队空队列Queue* pEmpty = &obj->q1, *pNonEmpty = &obj->q2;if(QueueEmpty(&obj->q1) != 0){pEmpty = &obj->q2;pNonEmpty = &obj->q1;}while(QueueSize(pNonEmpty) > 1){QueuePush(pEmpty, QueueFront(pNonEmpty));QueuePop(pNonEmpty);}int top = QueueFront(pNonEmpty);//队尾元素出队QueuePop(pNonEmpty);return top;
}/** Get the top element. */
int myStackTop(MyStack* obj) {//获取非空队列的队尾元素Queue* pEmpty = &obj->q1, *pNonEmpty = &obj->q2;if(QueueEmpty(&obj->q1) != 0){pEmpty = &obj->q2;pNonEmpty = &obj->q1;}return QueueBack(pNonEmpty);
}/** Returns whether the stack is empty. */
bool myStackEmpty(MyStack* obj) {return !(QueueEmpty(&obj->q1) | QueueEmpty(&obj->q2));
}void myStackFree(MyStack* obj) {QueueDestory(&obj->q1);QueueDestory(&obj->q2);free(obj);
}

3.用栈实现队列

(1)题目描述:

点击链接
在这里插入图片描述

(2)思路表述:

解题思路
此题可以用两个栈实现,一个栈进行入队操作,另一个栈进行出队操作出队操作: 当出队的栈不为空是,直接进行出栈操作,如果为空,需要把入队的栈元素全部导入到出队的栈,然后再进行出栈操作

1.在这里插入图片描述
2.
在这里插入图片描述
3.
在这里插入图片描述

(3)代码实现:

typedef struct {//入队栈Stack pushST;//出队栈Stack popST;
} MyQueue;/** Initialize your data structure here. */
MyQueue* myQueueCreate(int maxSize) {MyQueue* pqueue = (MyQueue*)malloc(sizeof(MyQueue));StackInit(&pqueue->pushST, maxSize);StackInit(&pqueue->popST, maxSize);return pqueue;
}/** Push element x to the back of queue. */
void myQueuePush(MyQueue* obj, int x) {//入队栈进行入栈操作StackPush(&obj->pushST, x);
}/** Removes the element from in front of queue and returns that element. */
int myQueuePop(MyQueue* obj) {//如果出队栈为空,导入入队栈的元素if(StackEmpty(&obj->popST) == 0){while(StackEmpty(&obj->pushST) != 0){StackPush(&obj->popST, StackTop(&obj->pushST));StackPop(&obj->pushST);}}int front = StackTop(&obj->popST);//出队栈进行出队操作StackPop(&obj->popST);return front;
}/** Get the front element. */
int myQueuePeek(MyQueue* obj) {//类似于出队操作if(StackEmpty(&obj->popST) == 0){while(StackEmpty(&obj->pushST) != 0){StackPush(&obj->popST, StackTop(&obj->pushST));StackPop(&obj->pushST);}}return StackTop(&obj->popST);
}/** Returns whether the queue is empty. */
bool myQueueEmpty(MyQueue* obj) {return StackEmpty(&obj->pushST) == 0&&  StackEmpty(&obj->popST) == 0;
}void myQueueFree(MyQueue* obj) {StackDestroy(&obj->pushST);StackDestroy(&obj->popST);free(obj);
}

好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!
在这里插入图片描述

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

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

相关文章

Python学习路线 - Python语言基础入门 - 准备工作

Python学习路线 - Python语言基础入门 - 准备工作 初识PythonPython的优点 什么是编程语言Python环境安装Windows系统Python安装Python验证 MacOS系统Linux系统 第一个Python程序常见问题 Python解释器Python解释器概念Python解释器存放位置Python解释器运行".py"文件…

vue3请求代理proxy中pathRewrite失效

问题引入 在vue3配置请求代理proxy的时候pathRewrite失效。 有这样一个例子&#xff0c;作用是为了把所有以/api开头的请求代理到后端的路径和端口上&#xff0c;在vue.config.js配置文件中 设置了代理跨域和默认端口。但是重新运行之后发现端口是改了&#xff0c;但是路径仍然…

【工作生活】汽车ECU开发内容简介

目录 1. 目标 2. 要分享什么 3.1 行业知识 3.1.1车载行业知识&#xff1a; 3.1.2项目&#xff1a; 3.1.3开发测试工具&#xff1a; 3.2 硬件平台 3.3 基础知识 3.4 工作生活 3. 我们是谁 1. 目标 随着新能源汽车的快速崛起&#xff0c;汽车电子行业开始快速发展&…

Redis数据结构之跳表

跳表是一种有序的数据结构&#xff0c;它通过在每个节点中维持多个指向其他节点的指针&#xff0c;从而达到快速访问节点的目的。其核心思想就是通过建立多级索引来实现空间换时间。 在Redis中&#xff0c;使用跳表作为Zset的一种底层实现之一&#xff0c;这也是跳表在Redis中的…

SpringBoot 集成 ChatGPT,实战附源码

1 前言 在本文中&#xff0c;我们将探索在 Spring Boot 应用程序中调用 OpenAI ChatGPT API 的过程。我们的目标是开发一个 Spring Boot 应用程序&#xff0c;能够利用 OpenAI ChatGPT API 生成对给定提示的响应。 您可能熟悉 ChatGPT 中的术语“提示”。在 ChatGPT 或类似语…

如何本地搭建个人hMailServer邮件服务并实现远程发送邮件

文章目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpola…

C语言中一些特殊字符的输出

目录 %的介绍 斜杠与反斜杠 转义字符 %的介绍 int a1; 1、printf(’’%d’’,a);//输出1 2、printf(’’%%d’’,a);//输出%d 3、printf&#xff08;’’%%%d ‘’,a)//输出%1 C语言中&#xff0c;%也是转义符&#xff0c;%%相当于% 斜杠与反斜杠 首先需要明白…

学习TypeScrip1(基本类型)

TS是JS的超集&#xff0c;所以JS基础的类型都包含在内起步安装 npm install typescript -g运行tsc 文件名 nodejs 环境执行 ts npm i types/node --save-dev &#xff08;node环境支持的依赖必装&#xff09; npm i ts-node --g 基础类型&#xff1a;Boolean、Number、Str…

持续集成部署-k8s-高级调度-InitC:初始化容器的概念和使用

持续集成部署-k8s-高级调度-InitC&#xff1a;初始化容器的概念和使用 1. Init Container&#xff08;初始化容器&#xff09;是什么&#xff1f;2. Init Container 的简单使用 1. Init Container&#xff08;初始化容器&#xff09;是什么&#xff1f; 在Kubernetes中&#x…

VLAN间路由详细讲解

本次实验拓扑的主要概述以及设计到的相关技术 VLAN技术&#xff1a; VLAN&#xff08;Virtual Local Area Network&#xff09;即虚拟局域网&#xff0c;是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。 每个VLAN是一个广播域&#xff0c;VLAN内的主机间可以直…

YOLOv8改进 | 2023 | SCConv空间和通道重构卷积(精细化检测,又轻量又提点)

一、本文介绍 本文给大家带来的改进内容是SCConv&#xff0c;即空间和通道重构卷积&#xff0c;是一种发布于2023.9月份的一个新的改进机制。它的核心创新在于能够同时处理图像的空间&#xff08;形状、结构&#xff09;和通道&#xff08;色彩、深度&#xff09;信息&#xf…

C语言 柔性数组

文章目录 定义使用 定义 C语言中的柔性数组&#xff08;Flexible Array&#xff09;是一种特殊的数组类型&#xff0c;它的长度可以在运行时动态确定。柔性数组通常用于结构体的最后一个成员&#xff0c;用于表示可变长度的数据。 struct Example {int length;int data[]; //…

@ResponseBody详解:用于响应体响应数据

RestFul风格或者是web阶段接触过的异步请求&#xff0c;都需要把数据转换成Json放入响应体中。 ResponseBody的作用其实是将java对象转为json格式的相应内容 使用 RequestMapping注解时&#xff0c;Spring会将返回值解析为视图路径&#xff0c;然后跳转路径返回对应的视图页面…

PyQt6 中自定义浮点型滑块类

介绍&#xff1a; 在PyQt6中&#xff0c;滑块&#xff08;Slider&#xff09;是常用的用户界面元素之一&#xff0c;用于选择数值范围。然而&#xff0c;有时候我们可能需要使用浮点数值&#xff0c;而标准的滑块仅支持整数。为了解决这个问题&#xff0c;我们可以创建一个自定…

数字图像处理(实践篇) 十六 基于分水岭算法的图像分割

目录 一 分水岭算法 二 利用OpenCV实现分水岭算法的过程 三 实践 一 分水岭算法 基于任何灰度图像都可以视为地形表面&#xff0c;其中高强度表示山峰和山丘&#xff0c;而低强度表示山谷。首先&#xff0c;开始用不同颜色的水&#xff08;标签&#xff09;填充每个孤立的山…

医院智能导诊小程序源码 智能导诊源码

医院智能导诊系统、AI智能导诊、现有的ai模型做医院智能导诊、智能就医引导系统、人工智能挂号、医院AI全流程智能导诊系统。 智能导诊 可以根据用户症状描述精准推荐科室及医生智能学习医院历史数据及自动进行科室对照,与医院的系统连接后,患者可直接完成预约。 一、系统概述…

sklearn教程:iris鸢尾花数据集数据分析

文章目录 数据集介绍导入数据集查看数据标签、属性和介绍查看数据整理为dataframe数据indo()查看数据类型和是否缺失describe() 提供数值型变量的描述性统计变量赋值标签编码分割训练集测试集查看X y 维度可视化分析箱线图查看数据分布和异常值直方图查看数值型数据分布密度图查…

【Java面试——并发基础、并发关键字】

3.1 并发基础 Java 并发 - 理论基础Java 并发 - 线程基础 多线程的出现是要解决什么问题的? 本质什么? CPU、内存、I/O 设备的速度是有极大差异的,为了合理利用 CPU 的高性能,平衡这三者的速度差异,计算机体系结构、操作系统、编译程序都做出了贡献,主要体现为: CPU 增加…

flutter-一个可以输入的数字增减器

效果 参考文章 代码 在参考文章上边&#xff0c;主要是改了一下样式&#xff0c;逻辑也比较清楚&#xff0c;对左右两边添加增减方法。 我在此基础上加了_numcontroller 输入框的监听。 加了数字输入框的控制 keyboardType: TextInputType.number, //设置键盘为数字 inputF…

python Thread

第一种 import threading import timedef a(url):print(f"--------start1:{url}---------")time.sleep(2)print(f"--------end1:{url}-----------")def b(url):print(f"--------start2:{url}---------")time.sleep(4)print(f"--------end2…