表达式求值(NC137/考察次数Top48/难度中等)
Posted 码农指南
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表达式求值(NC137/考察次数Top48/难度中等)相关的知识,希望对你有一定的参考价值。
描述:
请写一个整数计算器,支持加减乘三种运算和括号。
示例1
输入:
“1+2”
返回值:
3
示例2
输入:
“(2*(3-4))*5”
返回值:
-10
(题目来自牛客网)
用C++实现如下
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
int solve(string s) {
//思路,输入一串字符串,包含数字,加减乘除运算符以及括号等;
//1.用栈保存各部分计算的和num;2.遍历表达式;3.遇到数字时继续遍历求出这个完整的数字的值
//4.遇到左括号时,递归求出这个括号里面的表达式的值
//+则直接push进去;-则push进去负的当前数;如果是*或者除,pop出一个运算数和当前数作计算,最后栈中结果求和即可
stack<int> s1;
int n=s.size();
int result=0, num=0; // result存储最后结果; num存储当前的数字
char flag= '+';
for(int i = 0; i<n; i++) //遍历所有的字符,用c来存储
{
char c=s[i]; //取字符串的字符
if(c >= '0' && c <= '9') //如果为字符为数字
num = num*10+c-'0'; //如果下一位还是数字字符则求实际的num,注意,字符数字可通过-'0'来变整型数
if(c == '(') //如果是左括号,找到右括号,然后使用递归法进行求解
{
int j=i+1; //从当前位的下一位开始
int count=1; //累计左括号的数量,要找到与第一个匹配的右括号
while(count)
{
if(s[j] == ')')
count--;
else if(s[j] == '(')
count++;
j++; //用于计算后面取字符串的长度
}
num = solve(s.substr(i+1, j-i-1)); //使用递归法进行求解,求出括号中的num
i = j-1;
}
//一定要遇到运算符才说明此数结束了,才可以push,i==n-1用于处理最后一位(最后一位没有运算符)
//要么后面还有运算符则push(说明此位置数已经结束),要么后面没有运算符push
if(c == '+' || c == '-' || c == '*' || i == n-1)
{
if(flag == '+')
s1.push(num); //为加法,直接把num放到stack里面
if(flag == '-')
s1.push(-num); //为减法,把-num放进去
if(flag == '*') //为乘法,顶部与其相乘,然后需要把顶部的元素弹出,然后放入相乘得到的结果值
{
num*=s1.top();
s1.pop();
s1.push(num);
}
flag = c; //对flag完成一次更新
num = 0; //完成了一次放入,num需要初始化为零一次
}
}
while(!s1.empty()) //将stack里面的数字,依次相加得到结果
{
result += s1.top();
s1.pop();
}
return result;
}
};
纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!
以上是关于表达式求值(NC137/考察次数Top48/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章