栈相关算法题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.rhkb.cn/news/471963.html

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

相关文章

[Mysql] Mysql的多表查询----多表关系(上)

1、介绍 在实际开发中&#xff0c;一个项目通常需要很多张表才能完成。例如&#xff1a;一个商城项目就需要分类表、商品表、订单表等多张表。且这些表的数据之间存在一定的关系。 2、多表关系 Mysql多表之间的关系可以概括为&#xff1a;一对一、一对多/多对一、多对多关系…

【数据分享】全国农产品成本收益资料汇编(1953-2024)

数据介绍 一、《全国农产品成本收益资料汇编 2024》收录了我国2023年主要农产品生产成本和收益资料及 2018年以来六年的成本收益简明数据。其中全国性数据均未包括香港、澳门特别行政区和台湾省数据。 二、本汇编共分七个部分,即:第一部分,综合;第二部分,各地区粮食、油料;第…

使用 Prompt API 与您的对象聊天

tl;dr&#xff1a;GET、PUT、PROMPT。现在&#xff0c;可以使用新的 PromptObject API 仅使用自然语言对存储在 MinIO 上的对象进行总结、交谈和提问。在本文中&#xff0c;我们将探讨这个新 API 的一些用例以及代码示例。 赋予动机&#xff1a; 对象存储和 S3 API 的无处不在…

虎扑APP数据采集:JavaScript与AJAX的结合使用

引言 虎扑APP的数据采集涉及到前端和后端的交互&#xff0c;其中AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;技术允许在不重新加载整个页面的情况下&#xff0c;与服务器进行数据交换和更新部分网页内容。这种技术使得数据采集过程更加高效和用户友好。然而…

Flutter实现绝对定位学习

通过 Stack Positioned实现Flutter绝对定位学习。 简单Demo import package:flutter/material.dart;class MyPositionedDemoPage extends StatelessWidget {const MyPositionedDemoPage({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: …

《Probing the 3D Awareness of Visual Foundation Models》论文解析——多视图一致性

一、论文简介 论文讨论了大规模预训练产生的视觉基础模型在处理任意图像时的强大能力&#xff0c;这些模型不仅能够完成训练任务&#xff0c;其中间表示还对其他视觉任务&#xff08;如检测和分割&#xff09;有用。研究者们提出了一个问题&#xff1a;这些模型是否能够表示物体…

【C++】深入理解自定义 list 容器中的 list_iterator:迭代器实现详解

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 &#x1f4cc; 引言&#x1f4cc; 1. 为什么 list 容器需要 list_iterator…

昆明华厦眼科医院举办中外专家眼科技术研讨会

9月13日&#xff0c;“睿智迭代&#xff0c;增效赋能”Menicon Z Night中外专家研讨会在昆明华厦眼科医院成功举办。此次会议由目立康公司与昆明华厦眼科医院携手共筑&#xff0c;标志着双方合作迈向新的高度。 昆明华厦眼科医院总经理王若镜首先发表了热情洋溢的致辞&#xff…

FreeRTOS的列表与列表项

目录 1.为什么要学列表&#xff1f; 2.什么是列表和列表项&#xff1f; 2.1 列表 2.2列表项 2.3&#xff0c;迷你列表项 3.列表与列表项的初始化 3.1 列表初始化 3.2列表项初始化 4.列表项的“增删查”&#xff08;插入、删除、遍历&#xff09; 4.1列表项的插入 4.1.1…

前端(3)——快速入门JaveScript

参考&#xff1a; 罗大富 JavaScript 教程 | 菜鸟教程 JavaScript 教程 1. JaveScript JavaScript 简称 JS JavaScript 是一种轻量级、解释型、面向对象的脚本语言。它主要被设计用于在网页上实现动态效果&#xff0c;增加用户与网页的交互性。作为一种客户端脚本语言&#…

使用阿里云快速搭建 DataLight 平台

使用阿里云快速搭建 DataLight 平台 本篇文章由用户 “闫哥大数据” 分享&#xff0c;B 站账号&#xff1a;https://space.bilibili.com/357944741?spm_id_from333.999.0.0 注意&#xff1a;因每个人操作顺序可能略有区别&#xff0c;整个部署流程如果出现出入&#xff0c;以…

H.265流媒体播放器EasyPlayer.js H.264/H.265播放器chrome无法访问更私有的地址是什么原因

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、MP3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

QT_CONFIG宏使用

时常在Qt代码中看到QT_CONFIG宏&#xff0c;之前以为和#define、DEFINES 差不多&#xff0c;看了定义才发现不是那么回事&#xff0c;定义如下&#xff1a; 看注释就知道了QT_CONFIG宏&#xff0c;其实是&#xff1a;实现了一个在编译时期安全检查&#xff0c;检查指定的Qt特性…

centos7安装Chrome使用selenium-wire

背景&#xff1a;在centos7中运行selenium-wire爬虫&#xff0c;系统自带的Firefox浏览器不兼容&#xff0c;运行报错no attribute ‘set_preference’&#xff0c;应该是selenium-wire和Firefox的驱动不兼容 查了半天不知道怎么解决&#xff0c;就想在centos7上安装Chrome来跑…

医院信息化与智能化系统(21)

医院信息化与智能化系统(21) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

《FreeRTOS任务控制块篇》

Task control block, 即任务控制块。任务控制块&#xff08;TCB&#xff09;是一个结构体&#xff0c;它会分配给每个任务&#xff0c;其中存储着任务的状态信息&#xff0c;包括指向任务上下文&#xff08;任务的运行时环境&#xff0c;包括寄存器值&#xff09;的指针。任务控…

Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践

案例问题描述 该案例来自一个金融行业客户的问题&#xff1a;他们发现某个应用对一个数据量相对较小的表&#xff08;仅包含数千条记录&#xff09;访问时&#xff0c;频繁遇到性能下降的情况。为解决此问题&#xff0c;客户向我们求助进行分析。我们发现这张表有频繁的批量插…

ssh登陆服务器后支持Tab键命令补全

在服务器上新建了用户后&#xff0c;通过ssh登录到服务器后发现不能使用Tab键来进行命令补全 截图如下&#xff1a; 以为没有配置.bashrc 此时输入 source 发现无此命令 细心的可以发现 -sh 于是输入命令echo $SHELL 确认此时的shell为sh&#xff0c; 只要输入命令bash即可切…

[白月黑羽]关于仿写类postman功能软件题目的解答

原题&#xff1a; 答&#xff1a; python文件如下 from PySide6.QtWidgets import QApplication, QMessageBox,QTableWidgetItem,QHeaderView,QWidget,QTableWidget from PySide6.QtCore import QEvent,QObject from PySide6.QtUiTools import QUiLoader import time import …

Postman接口测试(断言、关联、参数化、输出测试报告)

基本界面展示 Get、Post请求 Postman断言 使用postman来判断预期结果与实际结果是否一致 响应状态码断言 响应包含字符串 断言判断字符串的格式 关联 用于解决http请求之间存在依赖关系 依赖&#xff1a;一个http请求的响应结果中的数据&#xff0c;被另一个请求使用 登…