eclipse做网站,中国石油工程建设公司,互联网平台是做什么的,做一个自己的免费网站题目
150. 逆波兰表达式求值
中等
给你一个字符串数组 tokens #xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意#xff1a;
有效的算符为 、-、* 和 / 。每个操作数#xff08;运算对象#xff09;都…题目
150. 逆波兰表达式求值
中等
给你一个字符串数组 tokens 表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意
有效的算符为 、-、* 和 / 。每个操作数运算对象都可以是一个整数或者另一个表达式。两个整数之间的除法总是 向零截断 。表达式中不含除零运算。输入是一个根据逆波兰表示法表示的算术表达式。答案及所有中间计算结果可以用 32 位 整数表示。 示例 1 输入tokens [2,1,,3,*]
输出9
解释该算式转化为常见的中缀算术表达式为((2 1) * 3) 9示例 2 输入tokens [4,13,5,/,]
输出6
解释该算式转化为常见的中缀算术表达式为(4 (13 / 5)) 6示例 3 输入tokens [10,6,9,3,,-11,*,/,*,17,,5,]
输出22
解释该算式转化为常见的中缀算术表达式为((10 * (6 / ((9 3) * -11))) 17) 5((10 * (6 / (12 * -11))) 17) 5((10 * (6 / -132)) 17) 5((10 * 0) 17) 5(0 17) 517 522 提示 1 tokens.length 104tokens[i] 是一个算符、-、* 或 /或是在范围 [-200, 200] 内的一个整数 逆波兰表达式
逆波兰表达式是一种后缀表达式所谓后缀就是指算符写在后面。
平常使用的算式则是一种中缀表达式如 ( 1 2 ) * ( 3 4 ) 。该算式的逆波兰表达式写法为 ( ( 1 2 ) ( 3 4 ) * ) 。
逆波兰表达式主要有以下两个优点
去掉括号后表达式无歧义上式即便写成 1 2 3 4 * 也可以依据次序计算出正确结果。适合用栈操作运算遇到数字则入栈遇到算符则取出栈顶两个数字进行计算并将结果压入栈中
思路和解题方法 首先我们创建一个栈 stk 用于存储数字。然后遍历字符串数组 tokens 中的每一个元素。 如果当前元素是数字我们将其转换为整数并将其压入栈 stk 中。 如果当前元素是操作符我们从栈 stk 中弹出两个元素进行计算并将计算结果压入栈 stk 中。 最后栈顶元素即为逆波兰表达式的计算结果将其返回即可。 在实现过程中我们使用一个辅助函数 isNumber()通过判断当前元素是否为运算符来确定相应的操作。 复杂度 时间复杂度: O(n) 空间复杂度均为 O(n)其中 n 是字符串数组 tokens 的长度。 空间复杂度 O(n) 空间复杂度为 O(n)。 c 代码 class Solution {
public:int evalRPN(vectorstring tokens) {stackint stk; // 创建一个栈用于存储数字int n tokens.size(); // 获取字符串数组的长度for (int i 0; i n; i) { // 遍历字符串数组中的每一个元素string token tokens[i];if (isNumber(token)) { // 如果当前元素是数字stk.push(atoi(token.c_str())); // 将其转换为整数并压入栈中} else { // 如果当前元素是操作符int num2 stk.top(); // 从栈中弹出第二个数字stk.pop();int num1 stk.top(); // 从栈中弹出第一个数字stk.pop();switch (token[0]) { // 根据操作符进行计算并将结果压入栈中case :stk.push(num1 num2);break;case -:stk.push(num1 - num2);break;case *:stk.push(num1 * num2);break;case /:stk.push(num1 / num2);break;}}}return stk.top(); // 返回栈顶元素作为逆波兰表达式的计算结果}bool isNumber(string token) { // 判断当前元素是否是数字return !(token || token - || token * || token /);}
};觉得有用的话可以点点赞支持一下。
如果愿意的话关注一下。会对你有更多的帮助。 每天都会不定时更新哦 人 。