《表达式的值II》 题解

目录

题目描述

输入描述

输出描述

解析

完整代码


 

描述

给出一个表达式,其中运算符仅包含+和-两种运算符,且没有括号。要求求出表达式的最终值。

数据保证要计算的数字的数量不超过100个,每个整数的数值和计算结果的数值都在int的范围内。

请注意:数字可能是1位数,也可能是多位数,如:1+1-1=1,12+23-11=24。

输入描述

仅一行,即为表达式。

输出描述

计算结果的数值。

用例输入 1 

1+1-1

用例输出 1 

1

这题就是一个一个去判断是什么符号,再执行相应的运算;

下面出示代码:

#include <bits/stdc++.h>
using namespace std;
int main() {
	int n,sum=0;
    char c;
    cin>>n;
    sum=n;
    while(scanf("%c %d",&c,&n)!=EOF){
        if(c=='+')sum+=n;
        if(c=='-')sum-=n;
    }
    cout<<sum;
 return 0;
}

 

算法思路: 1. 创建两个栈:一个操作数栈和一个操作符栈。 2. 从左到右遍历表达式,遇到操作数就压入操作数栈,遇到操作符就与操作符栈中的栈顶元素比较优先级。 3. 如果当前操作符的优先级大于操作符栈顶的操作符优先级,就将当前操作符压入操作符栈。 4. 如果当前操作符的优先级小于或等于操作符栈顶的操作符优先级,就从操作数栈中弹出两个操作数,从操作符栈中弹出一个操作符,进行计算并将结果压入操作数栈,重复步骤3,直到当前操作符的优先级大于操作符栈顶的操作符优先级。 5. 当遍历完表达式后,如果操作符栈中还有操作符,就将操作数栈中剩余的操作数和操作符栈中的操作符按照步骤4计算,直到操作符栈为空。 6. 操作数栈中最后剩下的元素就是表达式算法实现: ```python def calculate(s: str) -> int: # 定义操作符优先级 priority = {'+': 1, '-': 1, '*': 2, '/': 2} # 定义操作数栈和操作符栈 nums = [] ops = [] i = 0 while i < len(s): # 跳过空格 if s[i] == ' ': i += 1 continue # 如果是数字,压入操作数栈 if s[i].isdigit(): j = i while j < len(s) and s[j].isdigit(): j += 1 nums.append(int(s[i:j])) i = j # 如果是操作符,比较优先级 else: while ops and priority[ops[-1]] >= priority[s[i]]: b = nums.pop() a = nums.pop() op = ops.pop() if op == '+': nums.append(a + b) elif op == '-': nums.append(a - b) elif op == '*': nums.append(a * b) elif op == '/': nums.append(int(a / b)) ops.append(s[i]) i += 1 # 处理剩余的操作符 while ops: b = nums.pop() a = nums.pop() op = ops.pop() if op == '+': nums.append(a + b) elif op == '-': nums.append(a - b) elif op == '*': nums.append(a * b) elif op == '/': nums.append(int(a / b)) # 返回操作数栈中最后剩下的元素 return nums[-1] ``` 算法分析: 1. 时间复杂度:遍历一遍表达式,时间复杂度为O(n);操作符栈和操作数栈中每个元素都只进出一次,所以总时间复杂度为O(n)。 2. 空间复杂度:操作符栈和操作数栈的最大长度为表达式的长度,所以空间复杂度为O(n)。 参考链接: 1. [LeetCode官方题解](https://leetcode-cn.com/problems/basic-calculator-ii/solution/jian-dan-zhan-jie-fa-by-jerry_nju/) 2. [算法珠玑(第2版)](https://book.douban.com/subject/33437322/)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值