1. Basic Calculator

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces ``.

Example 1:

  1. Input: "1 + 1"
  2. Output: 2

Example 2:

  1. Input: " 2-1 + 2 "
  2. Output: 3

Example 3:

  1. Input: "(1+(4+5+2)-3)+(6+8)"
  2. Output: 23

Note:

  • You may assume that the given expression is always valid.
  • Do not use the eval built-in library function.

栈的应用

注意设置优先级时,左括号最高,右括号最低。实现过程如下:

  • 如果当前是数字,那么更新计算当前数字;
  • 如果当前是操作符+或者-,那么需要更新计算当前计算的结果res,并把当前数字num设为0,sign设为正负,重新开始;
  • 如果当前是(,那么说明后面的小括号里的内容需要优先计算,所以要把res,sign进栈,更新res和sign为新的开始;
  • 如果当前是),那么说明当前括号里的内容已经计算完毕,所以要把之前的结果出栈,然后计算整个式子的结果;
  • 最后,当所有数字结束的时候,需要把结果进行计算,确保结果是正确的。
  1. class Solution {
  2. public:
  3. unordered_map<char, int>prior{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}, {'(', 3}, {')', 0}};
  4. int calculate(string s) {
  5. s += "#";
  6. stack<int>nums;
  7. stack<char>op;
  8. string tmp = "";
  9. for(int i = 0; i < s.size(); ++i){
  10. if(s[i] == ' ')continue;
  11. if(isdigit(s[i])){
  12. tmp += s[i];
  13. }else{
  14. if(tmp.size() > 0){
  15. nums.push(stoi(tmp));
  16. tmp = "";
  17. }
  18. if(s[i] == '#')continue;
  19. while(!op.empty() && op.top() != '(' && prior[op.top()] >= prior[s[i]]){
  20. int n1 = nums.top();
  21. nums.pop();
  22. int n2 = nums.top();
  23. nums.pop();
  24. char ch = op.top();
  25. op.pop();
  26. nums.push(compute(n2, n1, ch));
  27. }
  28. if(s[i] == ')')op.pop();
  29. else op.push(s[i]);
  30. }
  31. }
  32. while(!op.empty()){
  33. int n1 = nums.top();
  34. nums.pop();
  35. int n2 = nums.top();
  36. nums.pop();
  37. char ch = op.top();
  38. op.pop();
  39. nums.push(compute(n2, n1, ch));
  40. }
  41. return nums.top();
  42. }
  43. int compute(int n1, int n2, char op){
  44. if(op == '+')return n1 + n2;
  45. if(op == '-')return n1 - n2;
  46. if(op == '*')return n1 * n2;
  47. if(op == '/')return n1 / n2;
  48. return -1;
  49. }
  50. };

【刷题-LeetCode】224. Basic Calculator的更多相关文章

  1. leetcode 224. Basic Calculator 、227. Basic Calculator II

    这种题都要设置一个符号位的变量 224. Basic Calculator 设置数值和符号两个变量,遇到左括号将数值和符号加进栈中 class Solution { public: int calcu ...

  2. [LeetCode] 224. Basic Calculator 基本计算器

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  3. Java for LeetCode 224 Basic Calculator

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  4. (medium)LeetCode 224.Basic Calculator

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  5. [leetcode]224. Basic Calculator

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  6. [LeetCode] 227. Basic Calculator II 基本计算器 II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  7. 【LeetCode】224. Basic Calculator 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 参考资料 日期 题目地址:https://lee ...

  8. 【LeetCode】224. Basic Calculator

    Basic Calculator Implement a basic calculator to evaluate a simple expression string. The expression ...

  9. 224. Basic Calculator + 227. Basic Calculator II

    ▶ 两个四则表达式运算的题目,第 770 题 Basic Calculator IV 带符号计算不会做 Orz,第 772 题 Basic Calculator III 要收费 Orz. ▶ 自己的全 ...

随机推荐

  1. py常用标准库

    functools python3中增加了更多工具函数,做业务开发时大多情况下用不到,记录一个比较常用的,给函数或者对象初始化参数 partial函数(偏函数) 把一个函数的某些参数设置默认值,返回一 ...

  2. JAVA开发 环境基础 IDEA 常用快捷键

    java 源代码运行必须先用javac编译生成字节码文件 XXX.class运行 java XXX 进行运行 环境变量classpath:已编译的字节码文件搜索路径--临时配置: set classp ...

  3. powerdesigner给列加上注释步骤

    powerdesigner给列加上注释步骤如图:

  4. 【LeetCode】339. Nested List Weight Sum 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 dfs 日期 题目地址:https://leetcod ...

  5. 【LeetCode】754. Reach a Number 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学 日期 题目地址:https://leetcod ...

  6. hdu 1431 素数回文(暴力打表,埃托色尼筛法)

    这题开始想时,感觉给的范围5 <= a < b <= 100,000,000太大,开数组肯定爆内存,而且100000000也不敢循环,不超时你打我,反正我是不敢循环. 这题肯定得打表 ...

  7. How many integers can you find(hdu1796)

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  8. 分布式系统(二)——GFS

    分布式存储系统的难点 在存储系统中,为了获得巨大的性能加成,一个很自然的想法就是采用分片(sharding),将数据分割存储到多台服务器上,这样获得了更大的存储容量,而且可以并行地从多台服务器读取数据 ...

  9. SHARPENING (HIGHPASS) SPATIAL FILTERS

    目录 Laplacian UNSHARP MASKING AND HIGHBOOST FILTERING First-Order Derivatives Roberts cross-gradient ...

  10. Android物联网应用程序开发(智慧园区)—— 图片预览界面

    效果图: 实现步骤: 1.首先在 build.gradle 文件中引入 RecycleView implementation 'com.android.support:recyclerview-v7: ...