当前位置: 首页 > news >正文

LeetCode.224基本计算器

问题描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

解题思路

逆波兰表示法是一种无需括号即可定义运算顺序的数学表达式表示方法,它利用栈的数据结构来处理操作符的优先级和括号,非常适合于解析和计算此类问题。使用 RPN 的好处包括:

  • 直接和顺序的计算流程,无需处理优先级和括号。
  • 实现简洁,只需一个栈即可完成所有操作。

实现步骤转换

接下来,讨论如何将题目要求转换为使用逆波兰表示法的实现步骤:

  1. 解析输入字符串

    • 从左到右扫描字符串。
    • 忽略空格。
    • 识别数字,并处理多位数。
    • 识别和处理操作符和括号。
  2. 构建逆波兰表达式

    • 使用一个栈来处理操作符,确保表达式中的运算符按正确的顺序输出到最终的逆波兰表达式中。
    • 遇到操作符时,比较栈顶操作符与当前操作符的优先级:
      • 如果栈顶操作符优先级较高或相等,从栈中弹出并输出到逆波兰序列,直到满足条件后将当前操作符压栈。
      • 括号特殊处理:左括号直接压栈,右括号则连续弹出栈顶操作符直到遇到左括号。
    • 数字直接输出到逆波兰序列。
  3. 计算逆波兰表达式

    • 再次使用栈来计算逆波兰表达式的结果。
    • 遇到数字则压栈。
    • 遇到操作符则从栈中弹出所需数量的数字进行计算,然后将结果压回栈中。
    • 表达式结束时,栈顶即为最终结果。

代码实现

class Solution {
public:int calculate(string s) {stack<int> vals; // 用于存储数值stack<char> ops; // 用于存储操作符,包括括号int currentNumber = 0;int result = 0; // For the current parenthesis levelint sign = 1;   // 1 表示正数,-1 表示负数for (char c : s) {if (isdigit(c)) {currentNumber = currentNumber * 10 + (c - '0');} else {result += sign * currentNumber;currentNumber = 0;if (c == '+') {sign = 1;} else if (c == '-') {sign = -1;} else if (c == '(') {// 把目前的结果和符号推入栈中vals.push(result);ops.push(sign);result = 0;sign = 1;} else if (c == ')') {// 结束当前层括号int op = ops.top();ops.pop();int val = vals.top();vals.pop();result = val + op * result;}}}result += sign * currentNumber;return result;}
};

相关文章:

  • 【幂等性】详解
  • springboot升级到2.7.17后,quartz集群模式配置修改
  • java多线程之ThreadLocal详解
  • 【Linux详解】进程地址空间
  • 网络爬虫中Xpath的使用方法
  • 【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(1)
  • 深度学习21-30
  • 先导小型工业4.0教学生产线助力制造业技术创新
  • 老年生活照护实训室:探索现代养老服务的奥秘
  • NAS安全存储怎样实现更精细的数据权限管控?
  • Grafana面试题精选和参考答案
  • 【计算机视觉】mmcv库详细介绍
  • sqlmap常用参数及示例
  • 重温react-07(函数注释和useEffect的使用方式)
  • 秋招Java后端开发冲刺——非关系型数据库篇(Redis)
  • ----------
  • ES6指北【2】—— 箭头函数
  • Debian下无root权限使用Python访问Oracle
  • EventListener原理
  • Javascript基础之Array数组API
  • js作用域和this的理解
  • Python 基础起步 (十) 什么叫函数?
  • Redis 中的布隆过滤器
  • Redux系列x:源码分析
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 关于List、List?、ListObject的区别
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 一个完整Java Web项目背后的密码
  • 阿里云服务器如何修改远程端口?
  • 国内开源镜像站点
  • !!Dom4j 学习笔记
  • #android不同版本废弃api,新api。
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #QT(一种朴素的计算器实现方法)
  • (33)STM32——485实验笔记
  • (bean配置类的注解开发)学习Spring的第十三天
  • (TOJ2804)Even? Odd?
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一)Docker基本介绍
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • .CSS-hover 的解释
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .net反编译的九款神器
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @ModelAttribute 注解
  • @PostConstruct 注解的方法用于资源的初始化
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码