【稀土掘金AI刷题】简单四则运算 两个数列

简单四则运算

问题描述

实现一个基本的计算器来计算一个简单的字符串表达式的值。注意事项如下:

  • 输入是一个字符串表达式(可以假设所给定的表达式都是有效的)

  • 字符串表达式可以包含的运算符号为:左括号 (, 右括号 ), 加号 +, 减号 -

  • 可以包含的数字为:非负整数(< 10)

  • 字符串中不包含空格

  • 处理除法 case 的时候,可以直接省略小数部分结果,只保留整数部分参与后续运算

  • 请不要使用内置的库函数 eval

输入格式

如:3+4*5/(3+2)

数据约束

见题目描述

输出格式

计算之后的数字

输入样例

  • 1+1
  • 3+4*5/(3+2)
  • 4+2*5-2/1
  • (1+(4+5+2)-3)+(6+8)

输出样例

  • 2
  • 7
  • 12
  • 23

思路

这种有层级且相邻层级之间有关系的可以使用栈stack来解决,我们定义一个nums栈用来存数字,ops栈来存加减乘除等操作。我们使用for循环来遍历输入的字符串表达式,如果这个字符是数字就压栈到nums中,如果是操作就压栈到ops中,这是我们最初的想法,但在表达式中有()和乘除与加减之间的优先级的操作,那么该如何解决呢?对于()和乘除与加减之间的运算级的优先问题,我们可以通过提前运算来解决。那么在压栈时,我们就要把运算符区分开来,遇见(我们就压进去,当遇见)时我们就要把括号之间的数都算赶紧再继续操作,遇见普通的加减乘除的运算符就要和栈顶比较运算级,如果栈顶的运算优先级大,我们就先处理已经入栈的表达式直到栈顶运算级较小为止。

代码实现(C++)

#include <iostream>
#include <string>
#include <stack>

using namespace std;

// 函数说明:判断字符c是否为数字
bool isDigit(char c) {
   
    return c >= '0' && c <= '9'; }

// 函数说明:将字符c由char转换为int
int char2int(char c) {
   
    return c - '0'; }

// 函数说明:由操作符operate决定a,b之间的运算并返回结果
double calculate(double a, double b, char operate)
{
   
   
    switch(operate)
    {
   
   
    case '+': return a + b;
    case '-': return a - b;
    case '*': return a * b;
    case '/': return a / b;
    }
    return -1;  // if error
}

// 函数说明:由运算符返回运算符等级
int precedence(char c)
{
   
   
    if (c == '*' || c == '/')
    {
   
   
        return 1;
    }
    else return 0;
}

// 函数说明:由输入的字符串表达式运算返回double类型的结果(主要算法函数)
double solution(const std::string expression)
{
   
   
    // 定义栈
    stack<double> nums;	// 存数的<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值