栈相关算法题1|通过栈判断链表是否对称|共享栈入栈出栈|括号匹配|多种括号配对|递归求序列最大值(C)

通过栈判断链表是否对称

设单链表的表头指针为L,data域为字符型,判断该链表的全部n个字符是否中心对称
xyx,xyyx

算法思想

使用栈来判断链表中的数据是否中心对称,让链表的前一半元素依次进栈
在处理链表的后一半元素时,当访问到链表的一个元素后,就从栈中弹出一个元素,两个元素比较,若相等,则将链表中的下一个元素与栈中再弹出的元素进行比较,直至链表尾。这时若栈是空栈,则得出链表中心对称的结论;否则当链表中的元素与栈中弹出元素不等时,结论为链表非中心对称,结束算法的执行

假设n是奇数,5
n/2=2,前两个元素入栈
![[Pasted image 20241115141716.png]]

创建s字符数组,大小是n/2=2
![[Pasted image 20241115141836.png]]

用i开始遍历数组,同时cur指针遍历链表,将链表前半的数据入栈
![[Pasted image 20241115142006.png]]

![[Pasted image 20241115142021.png]]

入栈完毕,如果n是偶数,则这时cur直接指向后半部分的首元素,由于这里n是奇数cur指向中间元素,需要后移一位
![[Pasted image 20241115142222.png]]

由于for循环最后一轮是i=2=n/2,循环结束
所以需要将i–,让i指向栈顶元素

通过while循环判断是否中心对称
若d4等于s1,i–,cur指向cur的next
![[Pasted image 20241115142803.png]]

若d5等于s0,i–,cur指向cur的next
这时cur指向NULL,循环结束
此时i=-1,说明链表中心对称,返回true

bool dc(LinkList L, int n)
{int i;// s字符栈char s[n/2];// 工作指针cur,指向待处理的当前元素LNode* cur = L->next;// 链表前一半元素入栈for (i = 0; i < n; i++){s[i] = cur->data;cur = cur->next;}// 恢复最后的i值i--;// 若n是奇数,后移过中心节点if (n % 2 == 1)cur = cur->next;// 检测是否中心对称while (cur && s[i] == cur->data){// i充当栈顶指针i--;cur = cur->next;}// 若栈为空栈if (i == -1)// 链表中心对称return true;else// 链表中心不对称return false;
}

共享栈入栈出栈

设有两个栈S1和S2都采用顺序栈的方式,并共享一个存储区,0-maxsize-1,为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式
实现入栈和出栈

算法思想

两个栈共享向量空间,将两个栈的栈底设在向量两端,初始时,S1栈顶指针为-1,S2栈顶指针为maxsize,两个栈顶指针相邻时为栈满
两个栈顶相向,迎面增长,栈顶指针指向栈顶元素
top指向的是栈顶元素,所以入栈的时候,先移动top指针,然后再输入x
出栈的时候,先返回出栈的元素值,再移动top指针
![[Pasted image 20241115145446.png]]

#define maxsize 100
// 两个栈共享顺序存储空间所能达到的最多元素数,初始化为100
#define ElemType int
// 假设元素类型为整型
typedef struct
{// 栈空间ElemType st[maxsize];// top为两个栈顶指针int top[2];
}ST;
ST s;// 入栈操作,i为栈号,i=0表示S1栈,i=1表示S2栈,x是入栈元素
// 入栈成功返回1,否则返回0
int push(int i, ElemType x)
{// 如果i不是0也不是1,退出程序if (i < 0 || i > 1){printf("栈号输入错误");exit(0);}// 如果两个栈顶指针相差1,即相邻,表示栈满if (s.top[1] - s.top[0] == 1){printf("栈已满");return 0;}switch(i){// 输入0,在S1栈输入xcase 0:// 先移动top0,再输入xs.st[++s.top[0]] = x;return 1;break;case 1:// 先移动top1,再输入xs.st[--s.top[1]] = x;return 1;}
}// 出栈算法,i表示栈号,0表示S1栈,1表示S2栈
int pop(int i)
{if (i < 0 || i > 1){printf("栈号输入错误");exit(0);}switch(i){case 0:// 如果top0指向-1,表示S1栈空if (s.top[0] == -1){printf("栈空\n");return -1;}else// 先返回栈顶元素,再移动top0指针return s.st[s.top[0]--];break;case 1:if (s.top[1] == maxsize){printf("栈空\n");return -1;}elsereturn s.st[s.top[1]++];break;}
}

括号匹配

设表达式以字符形式已存入数组E[n]中,’#‘为表达式的结束符
判断表达式中的括号是否配对:EXYX(E)

算法思想

判断表达式中的括号是否匹配,可以通过栈,是左括号时进栈,右括号时出栈
出栈时,若栈顶元素是左括号,则新读入的右括号与栈顶左括号就可以消去
输入表达式结束时,栈空则正确,否则括号不匹配

int EXYX(char E[], int n)
{// s是一维数组,容量足够大,用作存放括号的栈char s[30];// 用top做括号的栈顶指针int top = 0;// #先入栈,用于和表达式结束符号#匹配s[top] = '#';// 字符数组的工作指针int i = 0;// 逐字符处理字符表达式的数组while (E[i] != '#'){switch(E[i])case '(':// 左括号,入栈s[++top] = '(';i++;break;case ')':// 右括号,如果和栈顶匹配,左括号出栈if (s[top] == '('){top--;i++;break;}else{printf("括号不配对");exit(0);}case '#':if (s[top] == '#'){pritnf("括号配对");return 1;}else{printf("括号不配对");return 0;}default:i++;}
}

多种括号配对

设计一个算法,判断一个算数表达式中的括号是否匹配,算数表达式保存在带头节点的单循环链表中,每个节点有两个域,ch和next

算法思想

括号有三种圆括号,方括号和大括号
使用栈,当为左括号时,入栈,右括号时,若栈顶是其对应的左括号,则出栈,若不是其对应的左括号,则结论为括号不配对,
当表达式结束,若栈为空,则结论表达式括号配对,否则,结论表达式括号不配对

int Match(LinkList L)
{char s[];LNode* cur = L->next;STInit(s);while (cur != L){switch (cur->ch){case '(':STPush(s, cur->ch);break;case ')':if (STEmpty(s) || STTop(s) != '('){printf("括号不配对");return 0;}else{STPop(s);break;}case '[':STPush(s, cur->ch);break;case ']':if (STEmpty(s) || STTop(s) != '['){printf("括号不配对");return 0;}else{STPop(s);break;}case '{':STPush(s, cur->ch);break;case '}':if (STEmpty(s) || STTop(s) != '{'){printf("括号不配对");return 0;}else{STPop(s);break;}}cur = cur->next;}if (STEmpty(s)){printf("括号配对");return 1;}else{printf("括号不配对");return 0;}
}

递归求序列最大值

设整数序列a1,a2,…,an,使用递归思想求解最大值

int findMax(int a[], int left, int right)
{if(left == right){return a[left];}int mid = (left + right) / 2;int leftMax = findMax(a, left, mid);int rightMax = findMax(a, mid + 1, right);return max(leftMax, rightMax);
}

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

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

相关文章

datawhale11月组队学习 模型压缩技术3:2:4结构稀疏化BERT模型

文章目录 一、 半结构化稀疏性简介二、 代码实践2.1 定义辅助函数2.2 加载模型、tokenizer和数据集2.3 测试baseline模型指标2.4 对BERT-base模型进行半结构稀疏化 《datawhale2411组队学习之模型压缩技术1&#xff1a;模型剪枝&#xff08;上&#xff09;》&#xff1a;介绍模…

Qt中实现旋转动画效果

使用QPropertyAnimation类绑定对应的属性后 就可以给这个属性设置对应的动画 //比如自定义了属性 Q_PROPERTY(int rotation READ rotation WRITE setRotation)//给这个属性加动画效果 //参数1&#xff1a;谁要加动画效果 //参数2&#xff1a;哪个属性加动画效果 //参数3&…

视频流媒体播放器EasyPlayer.js RTSP播放器视频颜色变灰色/渲染发绿的原因分析

EasyPlayer.js RTSP播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0…

SpringBoot+Vue3开发会议管理系统

1 项目介绍 会议管理系统&#xff0c;简化公司内会议方面的流程&#xff0c;提供便捷。实现对会议室的管理、会议的管理、会议预约的管理&#xff0c;三大主流程模块。 系统分为三种角色&#xff0c;分别是员工、管理员和超级管理员。 员工角色功能&#xff1a;查看会议室占…

前端 JS 实用操作总结

目录 1、重构解构 1、数组解构 2、对象解构 3、...展开 2、箭头函数 1、简写 2、this指向 3、没有arguments 4、普通函数this的指向 3、数组实用方法 1、map和filter 2、find 3、reduce 1、重构解构 1、数组解构 const arr ["唐僧", "孙悟空&quo…

Clip结合Faiss+Flask简易版文搜图服务

一、实现 使用目录结构&#xff1a; templates ---upload.html faiss_app.py 前端代码&#xff1a;upload.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&quo…

【鸿蒙开发】第十一章 Stage模型应用组件-任务Mission

目录 1 任务(Mission)管理场景 2 任务&#xff08;Mission&#xff09;与启动模式 2.1 singleton单实例模式 2.2 multiton多实例模式 2.3 specified指定实例模式 3 页面栈及任务链 3.1 页面栈 3.2 任务链 4 设置任务快照的图标和名称 4.1 设置任务快照的图标&#xf…

探索 HTML 和 CSS 实现的模拟时钟

效果演示 这段代码是一个模拟时钟的 HTML 和 CSS 代码。它创建了一个简单的数字时钟界面&#xff0c;包括时针、分针和秒针。 HTML <div class"face"><p class"v-index">II</p><p class"h-index">II</p><d…

CSS预编译器:让样式编写更高效的秘密武器(6)

在现代前端开发中&#xff0c;CSS 预编译器是一种非常有用的工具&#xff0c;它通过扩展 CSS 语言的功能&#xff0c;帮助开发者更高效地编写和维护样式代码。本文将介绍 CSS 预编译器的基本原理&#xff0c;并重点讲解 LESS 的安装和使用方法。 1. 基本原理 编写 CSS 时&…

Vue3中实现插槽使用

目录 一、前言 二、插槽类型 三、示例 四、插槽的分类实现 1. 基本插槽 2. 命名插槽 3. 默认插槽内容 4. 作用域插槽&#xff08;Scoped Slots&#xff09; 5. 多插槽与具名插槽组合 一、前言 在 Vue 3 中&#xff0c;插槽&#xff08;Slot&#xff09;用于实现组件的内…

爬虫——Requests库的使用

在爬虫开发中&#xff0c;HTTP请求是与服务器进行交互的关键操作。通过发送HTTP请求&#xff0c;爬虫可以获取目标网页或接口的数据&#xff0c;而有效地处理请求和响应是爬虫能够高效且稳定运行的基础。Requests库作为Python中最常用的HTTP请求库&#xff0c;因其简洁、易用和…

如何使用EasyExcel生成多列表组合填充的复杂Excel示例

作者&#xff1a;Funky_oaNiu 一、&#xff08;需求&#xff09;生成的表格效果&#xff1a;二、搞一个模板文件三、建立对应的表格实体类四、开始填充五、Vue3前端发起请求下载六、官方文档及AI问答 一、&#xff08;需求&#xff09;生成的表格效果&#xff1a; 其中只有顶部…

三、计算机视觉_02计算机视觉领域的四大基本任务

0、前言 计算机视觉是人工智能领域的一个重要分支&#xff0c;它是一个跨学科的领域&#xff0c;涉及计算机科学、人工智能、机器学习、图像处理、神经科学等多个学科的知识 计算机视觉使用计算机技术来模拟人类视觉系统的功能&#xff0c;使计算机能够从图像或多维数据中提取…

Docker: ubuntu系统下Docker的安装

安装依赖 操作系统版本 Ubuntu Kinetic 22.10Ubuntu Jammy 24.04 (LTS)Ubuntu Jammy 22.04 (LTS)Ubuntu Focal 20.04 (LTS)Ubuntu Bionic 18.04 (LTS) CPU架构支持 ARMx86_64 查看我们的系统版本信息 uname -a通过该命令查得cpu架构是x86_64的&#xff1b; cat /etc/*re…

【已解决】 Tomcat10.1.x使用JSTL标签库

IDEA创建Java EE项目&#xff0c;使用Spring Spring MVC MyBatis框架&#xff0c;使用maven管理依赖。项目当前的环境是&#xff1a; Tomat 10.1.28Maven 3.6.3JDK 17 项目的功能&#xff1a;读取数据库的report表中的数据&#xff0c;返回一个List集合对象reportList在JSP…

LeetCode74. 搜索二维矩阵(2024冬季每日一题 6)

给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…

数据分析24.11.13

Excel 函数 求和 函数 sum() sumif() SUMIF(range, criteria, [sum_range]) sumifs() average() count() max() min() 逻辑 函数 if() iferror() 查询函数 VLOOKUP()

DveOps-Git-版本控制

1. 概述 分布式版本控制系统 版本控制 2. Git极速上手指南 官方传送门:Git - Branching and Merging 2.1 安装 ## windows https: git-scm.com/download/## Linux(CentOS/Fedora/Rocky Linux/RHEL) yum install -y git ## MacOS brew install git## Ubuntu/Debian apt in…

DevOps工程技术价值流:加速业务价值流的落地实践与深度赋能

DevOps的兴起&#xff0c;得益于敏捷软件开发的普及与IT基础设施代码化管理的革新。敏捷宣言虽已解决了研发流程中的诸多挑战&#xff0c;但代码开发仅是漫长价值链的一环&#xff0c;开发前后的诸多问题仍亟待解决。与此同时&#xff0c;虚拟化和云计算技术的飞跃&#xff0c;…

Tensorflow基本概念

简介&#xff1a;本文从Graph讲到Session&#xff0c;同时讲解了tf.constant创建tensor的用法和variable需要初始化的知识点&#xff0c;可以给你打好一个学习Tensorflow的基础。本文都是基于TensorFlow1.14.0的版本下运行。 本专栏将会系统的讲解TensorFlow在1.14.0版本下的各…