本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总
【题目来源】
AcWing:6027. 后缀表达式的值 - AcWing题库
【题目描述】
从键盘读入一个后缀表达式(字符串),只含有0 − 9 0-90−9组成的运算数及加(+)、减(-)、乘(*)、除(/)四种运算符。
每个运算数之间以及运算数和运算符之间用单个空格隔开,不需要判断给你的表达式是否合法。
以@作为结束标志。
比如,16–9*(4+3)转换成后缀表达式为:16 9 4 3 +*-,在字符数组 中的形式为:
栈中的变化情况:
运行结果为− 47 -47−47。
【输入】
一个字符串表示给定后缀表达式。
【输出】
一个整数,表示给定后缀表达式的值。
【输入样例】
16 9 4 3 +*-@【输出样例】
-47【算法标签】
#栈#
【代码详解】
#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;stack<LL>stk;// 运算数栈,用于后缀表达式计算// 计算函数:根据运算符c计算a和b的结果LLcalc(LL a,LL b,charc){switch(c)// 根据运算符进行相应计算{case'+':// 加法{returna+b;}case'-':// 减法{returna-b;}case'*':// 乘法{returna*b;}case'/':// 除法{returna/b;}default:// 默认情况(不应该发生){return0;}}}intmain(){chars[260];// 输入字符串缓冲区LL num=0;// 当前正在读取的数字boolreadingNum=false;// 标记是否正在读取数字// 读取一行输入,直到遇到换行符cin.getline(s,260);// 遍历输入字符串,直到遇到'@'结束符for(inti=0;s[i]!='@';++i){if(s[i]>='0'&&s[i]<='9')// 如果是数字字符{num=num*10+(s[i]-'0');// 构建多位数readingNum=true;// 标记正在读取数字}elseif(s[i]==' ')// 如果是空格(数字结束符){if(readingNum)// 只有在读取了数字后才压栈{stk.push(num);// 将完整数字压入栈num=0;// 重置数字readingNum=false;// 标记数字读取结束}}else// 如果是运算符{// 如果前面有数字未压栈,先压栈if(readingNum){stk.push(num);num=0;readingNum=false;}// 从栈中弹出两个操作数LL b=stk.top();// 第二个操作数stk.pop();LL a=stk.top();// 第一个操作数stk.pop();// 计算并将结果压回栈中stk.push(calc(a,b,s[i]));}}// 输出栈顶元素(最终计算结果)cout<<stk.top();return0;// 程序正常结束}【运行结果】
16 9 4 3 +*-@ -47