目录

  • 题目描述
  • 题目分析
  • c++代码

题目描述

给你一个字符串表达式s,请你实现一个基本的计算器来返回它的值。注意不允许使用任何将字符串作为数学表达式计算的内置函数,比如:eval()。
示例一:
输入:s=“1+1”
输出:2
示例二:
输入:s=" 2-1 + 2"
输出:3
示例三:
输入:s="(1+(4+5+2)-3)+(6+8)"
输出:23

题目分析

涉及到优先级问题,准备用栈做。需要解决 :什么时候可以计算?什么时候需要等待?即需要我们设置一个标志位来记录计算的状态(compute_flag)。
计算流程:未遇到左括号可先行计算(compute_flag=1),遇到左括号停止计算(compute_flag=0),等待右括号出现则继续计算(compute_flag=1)。
数据提取:需将字符串中的表达式进行分解,我们将数字与运算符单独存放在各自的栈中(number_stack与operation_stack)。当数字栈中存储够两个数字且操作符栈中存在操作符,则将这两个数字与运算符弹出栈进行计算,将计算后的值重新push进栈顶。若栈内元素不够计算,则往栈内push新的值。此外,遇到“(”运算符则停止计算继续push,遇到“)”运算符继续计算。

以1+121-(14+(5-6))为例:





字符串的处理:
主要存在两种状态,一种是数值,一种是运算符。
遇到数值,则进行数值拼接,如123,需要将每次取到的位上的值进行处理最终拼接成int型123———(((‘1’-‘0’)*10)+(‘2’-‘0’))*10+(‘3’-‘0’))。
遇到空值需跳过,需要注意首位为“-”的情况!若第一个为负数,需先将数字栈补充0。

c++代码

#include <stack>
#include <string>
class Solution {public://具体的计算函数void compute(std::stack<int>& number_stack, std::stack<char>& operation_stack) {if (number_stack.size() < 2) {return;}int num2 = number_stack.top();number_stack.pop();int num1 = number_stack.top();number_stack.pop();if (operation_stack.top() == '+') {number_stack.push(num2 + num1);}else if (operation_stack.top() == '-') {number_stack.push(num1 - num2);}operation_stack.pop();}//如何再合适的时候调用计算函数int calculate(std::string s) {//不同的状态代表不同的操作static const int STATE_BEGIN = 0;static const int NUMBER_STATE = 1;static const int OPERATION_STATE = 2;//设置两个栈用于存放数字与运算符std::stack<int> number_stack;std::stack<char> operation_stack;//设置初始变量int number = 0; //用于计算字符串中数值int STATE = STATE_BEGIN; //初始状态int compuate_flag = 0; //计算标记位 0不计算  1计算 for (int i = 0; i < s.length(); i++) {//考虑开头是负数的情况if (i == 0) {if (s[i] == '-') {number_stack.push(0);operation_stack.push(s[i]);}}//空格位直接跳过if (s[i] == ' ') {continue;}switch (STATE) {case STATE_BEGIN:if (s[i] >= '0' && s[i] <= '9') {STATE = NUMBER_STATE;}else {STATE = OPERATION_STATE;}i--;break;case NUMBER_STATE:if (s[i] >= '0' && s[i] <= '9') {//下面操作就是如果只有各位数字。将个位数字变为int型,如果有别的位数则下一次进入变为对应的整数型数值//10*number为上一次的位数值(int),s[i]-'0'为本次位数(int)int a = s[i] - '0';number = 10 * number + a;}//如果这个数的所有位数都遍历完,则把它push到number_stackelse {number_stack.push(number);//判断是否能进行一次计算if (compuate_flag == 1) {compute(number_stack, operation_stack);}//重置numbernumber = 0;//序号归位i--;//开始进行运算符操作STATE = OPERATION_STATE;}break;case OPERATION_STATE:if (s[i] == '+' || s[i] == '-') {operation_stack.push(s[i]);compuate_flag = 1;}// ( 不计算,继续往number_stack里面push新的数字else if (s[i] == '(') {STATE = NUMBER_STATE;compuate_flag = 0;}else if (s[i] >= '0' && s[i] <= '9') {STATE = NUMBER_STATE;i--;}else if (s[i] == ')') {compute(number_stack, operation_stack);}break;}}if (number != 0) {number_stack.push(number);compute(number_stack, operation_stack);}if (number == 0 && number_stack.empty()) {return 0;}return number_stack.top();}
};
//测试
int main() {std::string s1 = "2+1";std::string s2 = "-1+1";std::string s3 = "-122+(2-(2+3))";Solution solve;printf("%d\n", solve.calculate(s1));printf("%d\n", solve.calculate(s2));printf("%d\n", solve.calculate(s3));return 0;
}

力扣—— 224. 基本计算器(困难)相关推荐

  1. 力扣772 基本计算器III

    通过不懈的努力终于写好了Golang的语言的代码~ 其实本来还是可以写的很简单的,但是为了加强栈在go语言中的操作,还是用stack进行了编写 题目如下: 实现一个基本的计算器来计算简单的表达式字符串 ...

  2. 力扣772 基本计算器 III

    772. 基本计算器 III 实现一个基本的计算器来计算简单的表达式字符串. 表达式字符串只包含非负整数,算符 +.-.*./ ,左括号 ( 和右括号 ) .整数除法需要 向下截断 . 你可以假定给定 ...

  3. 力扣——174.地下城游戏(困难难度)——万能的递归与动态分析

    力扣--174. 地下城游戏 一.算法目录合集 1.地址 2.说明 二.题目说明 1.题干 2.原地址 三.实现步骤 1.思路分析 1.1.分析问题 1.2.具体步骤 ① 特殊情况分析 ② 常规分析 ...

  4. 力扣——42.接雨水(困难难度)——条条大路通罗马

    力扣--42.接雨水 一.算法目录合集 1.地址 2.说明 二.题目说明 1.题干 2.原地址 三.实现步骤 1.思路分析 1.1.分析问题 1.2.转化问题 1.3.简化问题 1.4.具体步骤 ① ...

  5. 9.18 困难力扣827. 最大人工岛

    827. 最大人工岛 - 力扣(LeetCode) 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 . 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 ...

  6. C++ : 力扣_Top(218-289)

    C++ : 力扣_Top(218-289) 文章目录 C++ : 力扣_Top(218-289) 218.天际线问题(困难) 227.基本计算器II(中等) 230.二叉搜索树中第K小的元素(中等) ...

  7. [力扣刷题总结](栈和单调栈篇)

    文章目录 ~~~~~~~~~~~~栈~~~~~~~~~~~~ 155. 最小栈 解法1:链表 剑指 Offer 31. 栈的压入.弹出序列 解法1:模拟栈 20. 有效的括号 解法1:栈 相似题目: ...

  8. 算法面试不懂这6大数据结构知识一定挂!(附力扣LeetCode真题讲解)

    本文作者:苏勇,Google 资深技术工程师 首发地址:https://mp.weixin.qq.com/s/u8pvmupISQ5D4kGIkgfKbA 在互联网行业的算法面试中经常会被考到数据结构 ...

  9. 力扣(LeetCode)刷题,简单+中等题(第33期)

    目录 第1题:Z 字形变换 第2题:删除字符串中的所有相邻重复项 第3题:基本计算器 II 第4题:螺旋矩阵 第5题:螺旋矩阵 II 第6题:盛最多水的容器 第7题:删除有序数组中的重复项 II 第8 ...

最新文章

  1. 宕机的阿里云们正在杀死运维?
  2. NXP(I.MX6uLL)DDR3实验——DDR3初始化、校准、超频测试
  3. 单调栈3_水到极致的题 HDOJ4252
  4. 【C++模板】特化与偏特化 template [partial] specialization
  5. LeetCode 三数之和 — 优化解法
  6. libjpeg(2)
  7. 求解偏微分方程开源有限元软件deal.II学习--Step 7
  8. Vue_(组件)计算属性
  9. 对于Y=Hx的H细节的一些讨论
  10. 在线轻松制作微信公众号封面次图的方法
  11. QT5在arm板上的汉字显示
  12. 大数据时代下的SQL Server第三方负载均衡方案----Moebius测试
  13. SaaS服务应用集成和生态该何去何从
  14. 合并excel单元格的两种方法
  15. 青春不是用来抱怨,而是用来奋斗的
  16. 葵花宝典第一招:唐氏均线成交量参数
  17. [cesium] | 视频融合 | 基于3dtileset的视频投射插件 | 支持动态调整角度
  18. OpenCV--0016:图像ROI与ROI操作
  19. java基础网络编程
  20. 图像处理(数字图像处理)

热门文章

  1. 横断面数据提取工具_SDTP_CAD断面数据处理教程
  2. ad网络标号怎么批量设置_网络打印机怎么设置 网络打印机安装方法【详细步骤】...
  3. 【TGRS】Ship Detection in Large-Scale SAR Images Via Spatial Shuffle-Group Enhance Attention译读笔记
  4. COCO和 PASCAL VOC标注格式的学习笔记
  5. MATLAB中如何生成指定范围的随机整数向量
  6. 非对称加密算法RSA
  7. Python的基础知识【面试遇到】
  8. 敏捷开发绩效管理之五:敏捷开发生产率(上)(故事点估算)
  9. ActiveMq生产者流量控制(Producer Flow Control)
  10. NFV-Bench A Dependability Benchmark for Network Function Virtualization Systems