题目描述

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

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

给定的字符串表达式由数字、‘+’、‘-’、‘(’、‘)’、‘ ’组成。

比如给定字符串"1 +1", 函数需要返回结果2。

解法:双栈

首先看到这个题应该会想到后缀表达式的计算过程,设置一个nums栈存放数字,遇到运算符就取nums栈顶两个元素计算,然后放回栈中。但是题目给的是一个中缀表达式,计算需要考虑优先级,因此可以增加一个ops栈来存放操作符,而与后缀表达式不同的是,计算过程中根据不同的ops执行不同的操作步骤

遍历一个字符串表达式的具体过程如下:

数字: 直接放入nums栈。 这里在代码中需要注意,有些数字可能是由好几位组成,比如123+123, 读取的时候一定要注意将123整体读进去。

左括号: 直接入ops栈。 左括号表示括号内计算的开始,直接入栈,不用执行任何操作。

右括号:按照后缀表达式的方法计算,直到遇到左括号。 右括号与之对应的左括号构成了一个子式,这个子式在遇到右括号时就可以开始计算。

加减: 遇到加减,先判断ops栈顶是否还是加减,如果是的话,说明nums中有数字还没有计算,按照后缀表达式的方法计算就好,计算完成后将这一位的加减入栈。

在实现过程中还有一些细节需要注意:

  • 所给表达式中可能存在一些空格,需要先将表达式中的空格清除。
  • 表达式首位可能是负号,这样操作符出栈时,nums栈也出栈,可能会报栈为空的错误,所以可以往表达式首位放一个0,避免分情况讨论。
  • 与第二点类似,可能出现连续符号的情况,比如1+(-2),为避免报错,可以在-号入栈时,nums中加一个0。

代码:

class Solution {public:void cleanSpace(string& s){int pos = s.find(" ");while (pos != -1) {s.replace(pos, 1, "");pos = s.find(" ");}}void calc(stack<int>& nums, stack<char>& ops){if(nums.size()<2 || ops.empty()) return;int a=nums.top();nums.pop();int b=nums.top();nums.pop();char op=ops.top();ops.pop();nums.push(op=='+'?a+b:b-a);}int calculate(string s) {stack<int> nums;stack<char> ops;cleanSpace(s);// 清除空格nums.push(0);int n=s.size();for(int i=0; i<n; i++){char c=s[i];if(c=='('){ops.push(c);}else if(c==')'){// 右括号的话计算到碰到左括号while(!ops.empty()){if(ops.top()!='('){// 计算没有遇到终点calc(nums, ops);}else{// 遇到左括号 运算结束ops.pop();// 左括号弹出break;// 跳出循环}}}else if(isdigit(c)){// 如果是数字// 需要考虑一下连续数字的情况int num=0;int j=i;while(j<n && isdigit(s[j])){// j在数组范围内而且j位置处是数字如果j开始是数字num = num*10 + (s[j]-'0');j++;}// 计算出一整串数字 最后j停留在数字的下一位上i=j-1;nums.push(num);}else{// 如果是正负号 看看它的左边有没有左括号if(i>0 && (s[i-1]=='(' || s[i-1]=='+' || s[i-1]=='-')){nums.push(0);}// 正负号别着急入栈 看看ops栈顶是不是+-,如果是的话先计算while(!ops.empty() && ops.top()!='('){calc(nums, ops);}ops.push(c);}}if(!ops.empty()){calc(nums, ops);}return nums.top();}};

LeetCode224 基本计算器相关推荐

  1. leetcode224. 基本计算器

    leetcode224. 基本计算器 题目描述 链接: leetcode167. 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值. 示例1: 输入:s = "1 + 1 ...

  2. LeetCode224基本计算器用DFA实现超简洁

    痛点 题目是:给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值. 比如: 输入:s = "(1+(4+5+2)-3)+(6+8)" 输出:23 这题有点类似编译 ...

  3. Leetcode224 基本加减计算器-双栈和状态转换

    题目 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 . 示例 1: 输入: "1 + 1&quo ...

  4. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...

  5. 力扣772 基本计算器III

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

  6. 怎么用python自制计算公式_手把手教你用python制作简易计算器,能够记录你使用的情况...

    话不多说,首先先看效果图,它能够记录你在使用过程中的历史,方便你查看是否有错: 接下来就仔细分析一下是如何制作的: 简易计算器 第一步:导入资源库 在过程中使用到了tkinter这个资源库,win+R ...

  7. java体重指数计算器程序_java 学习 ——计算器小程序

    简易计算器小程序代码: package jisuanqi; //声明需要插入的包 import java.awt.*; import java.lang.Object; import java.lan ...

  8. c语言计算器实训任务案例,C/C++经典实例之模拟计算器示例代码

    前言 本文主要给大家介绍了关于利用C/C++如何实现模拟计算器的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. Problem Description 简单计算器模拟:输入 ...

  9. 用计算机计算教学反思,《用计算器计算》教学反思

    <用计算器计算>教学反思 身为一名刚到岗的人民教师,教学是重要的工作之一,写教学反思能总结我们的教学经验,写教学反思需要注意哪些格式呢?下面是小编为大家整理的<用计算器计算>教 ...

最新文章

  1. android事件分发 入口(dispatchTouchEvent)
  2. 井下三专两闭锁的内容_局部通风机三专两闭锁具体规定
  3. kitten编程猫里的函数定义,函数实现和函数调用原理
  4. 带有Swagger的Spring Rest API –集成和配置
  5. HDU2178 猜数字【数学计算+水题】
  6. Vue中登陆超时,返回登陆页面
  7. myeclipse 创建 maven项目的时候出现:invalid project description 解决方法
  8. linux添加网络节点,Pi网络节点配置教程(windows10专业版)
  9. ABB机器人指令列表分类详解
  10. 基于AT89C51单片机的超声波传感器测距【程序详细代码及注释】
  11. 异数OS 开放式闭源继承人协议
  12. 如何在PowerPoint中添加幻灯片编号
  13. 二进制 转换 .java_如何在Java程序中将二进制转换为十进制?
  14. hive sql alter table 修改表操作小记
  15. Unity镜头光晕模拟开源库
  16. JAVA删除pdf空白页_【教程】Spire.PDF 教程:在C# 删除 PDF 中的空白页
  17. 基于阿里云生态构建网聚宝业务监控系统
  18. Vissim83D动态仿真
  19. JAVA ECLIPSE安装
  20. 【机器学习和数据分析与可视化课程设计】基于天气预报的数据分析与可视化课程设计(Python实现)

热门文章

  1. IOS音频的流媒体播放
  2. Java编程基础(1)
  3. Facebook Instant Game 设置智能助手
  4. Linux高精度struct timespec 和 struct timeval
  5. Spearman相关系数的含义及适用场景
  6. 网站被降权后如何恢复
  7. javaKMP算法(含KMP算法代码)
  8. Linux LVM HOWTO
  9. 产品设计之二:优化你的产品细节
  10. 从0到1写嵌入式操作系统---------------------------4尝试两个任务的切换