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

【数据结构】栈——必做题

逆波兰表达式

后缀表达式的出现是为了方便计算机处理,它的运算符是按照一定的顺序出现,所以求值过程中并不需要使用括号来指定运算顺序,也不需要考虑运算符号(比如加减乘除)的优先级。

先介绍中简单的人工转化方法:
假设有一个中缀表达式a+b*c-(d+e):
首先将这个中缀表达式的所有运算加括号((a+(b*c))-(d+e))
然后将所有运算符放到括号后面,这样就变成了((a(bc)* )+ (de)+ )-
把所有括号去掉abc*+de+-,最后得出的结果就是后缀表达式。

20. 有效的括号 - 力扣(LeetCode)

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

示例:

输出false的情况有三种,一是左括号多,二是右括号多,三是左右括号不匹配
( [ ] ) ——正常
( [ ) ] ——左右括号不匹配
( [ ( ) ] ——左括号多
) ( ——右括号多
思路:
遇到左括号,将对应的右括号入栈(方便后面比较)
遇到右括号,栈不空,将栈顶元素与其比较是否相等,相等则出栈,不相等则返回false(左右不匹配)
栈空,返回false(右括号多)
遍历字符串结束,若栈不为空,则返回false(说明左括号多)
bool isValid(char * s)
{char Stack[3500];int top=0;for(int i=0;i<strlen(s);i++){//等于左括号if( s[i]=='(')Stack[top++]=')';else if( s[i]=='[')Stack[top++]=']';else if( s[i]=='{')Stack[top++]='}';else if( top!=0 && s[i]==Stack[top-1])top--;elsereturn false;}return !top;
}

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
输入:"abbaca"
输出:"ca"
解释
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
char * removeDuplicates(char * s)
{int len=strlen(s);//char Stack[8000];原先是这样定义的,但是一直输出NULLchar* Stack = (char*)malloc(sizeof(char) * len + 1);int top=0;int i=0;for(i=0;i<len;i++){if( top>0 &&s[i]==Stack[top-1])top--;elseStack[top++]=s[i];}Stack[top]='\0';return Stack;
}

那又为什么定义一个数组当作栈不行呢?

  • 经过一番搜索发现犯了一个错误,函数里的静态局部变量在函数结束后就销毁了,返回的也就是无效的值,即返回了一个局部变量Stack的指针,而这个指针在函数返回后不再有效。

  • 为了避免这种情况,代码需要使用动态内存分配,以确保函数返回后所分配的内存仍然可用。(因为没有释放嘛)


150. 逆波兰表达式求值 - 力扣(LeetCode)

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
有效的算符为 '+'、'-'、'*' 和 '/' 。
每个操作数(运算对象)都可以是一个整数或者另一个表达式。
两个整数之间的除法总是 向零截断 。
表达式中不含除零运算。
输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。
int evalRPN(char ** tokens, int tokensSize)
{int stack[5000];int top = 0;int ret = 0;for (int i = 0; i < tokensSize; i++){if (strcmp(tokens[i], "+") == 0){stack[top-2] = stack[top - 2] + stack[top - 1];top--;}else if (strcmp(tokens[i], "-") == 0){stack[top-2] = stack[top - 2] - stack[top - 1];top--;}else if (strcmp(tokens[i], "*") == 0){stack[top-2] = stack[top - 2] * stack[top - 1];top --;}else if (strcmp(tokens[i], "/") == 0){stack[top-2] = stack[top - 2] / stack[top - 1];top --;}else{//atoi函数将字符串转换为数字stack[top++] = atoi(tokens[i]);}}return stack[top - 1];
}

写在最后

👍🏻 点赞,你的认可是我创作的动力!
收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!

http://www.lryc.cn/news/2041.html

相关文章:

  • LearnOpenGL 笔记 - 入门 04 你好,三角形
  • keepalived+mysql高可用
  • JAVA工具篇--1 Idea中 Gradle的使用
  • 弄懂自定义 Hooks 不难,改变开发认知有点不习惯
  • Java面向对象基础
  • 基于python下selenium库实现交互式图片保存操作(批量保存浏览器中的图片)
  • 一:Datart的下载、本地运行
  • Docker-compose
  • 经典文献阅读之--PLC-LiSLAM(面,线圆柱SLAM)
  • 计算组合数Cnk即从n个不同数中选出k个不同数共有多少种方法math.comb(n,k)
  • 工厂设计模式
  • IO多路转接 —— poll和epoll
  • 计算机网络整理-问答
  • JS 实现抛物线动画案例
  • CSGO搬砖项目,23年最适合小白的项目!
  • 谈谈会话管理
  • Linux查看JVM FULL GC频率
  • java世界String的那些事
  • 【图像配准】多图配准/不同特征提取算法/匹配器比较测试
  • 2023金三银四季跳槽季,啃完这软件测试面试题,跳槽不就稳稳的了
  • 【C++详解】——vector类
  • uniapp 离线本地打包
  • 初识马尔科夫模型(Markov Model)
  • CentOS7 ifconfig(或 ip addr)命令不显示IP地址
  • 2023/2/10总结
  • 2023最新版!宝塔面板Docker自建Bitwarden密码管理
  • 【Hello Linux】 Linux基础命令
  • 151、【动态规划】leetcode ——2. 01背包问题:二维数组+一维数组(C++版本)
  • 2023-02-09 - 3 Elasticsearch基础操作
  • 云原生系列之使用 prometheus监控MySQL实战