博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
224. Basic Calculator
阅读量:6342 次
发布时间:2019-06-22

本文共 2763 字,大约阅读时间需要 9 分钟。

一、题目

  1、审题

  

  2、分析

    给出字符串表示的包含有 +、-、( 、) 运算符以及空格、数字的整形运算,求出其结果。

 

二、解答

  1、思路

    循环遍历 S 中的字符 c:

    ①、当 c == 数字:将与其相邻的数字组合成整数。

    ②、当 c == ‘+’ : 前一个操作数输入完毕,开始新的运算,且为加法运算。

    ③、当 c == -: 前一个操作数输入完毕,开始新的运算,且为减法运算。

    ④、当 c == '(':将前边的运算结果 result 与操作符 sign 压入栈,开始新的运算,result、sign初始化。

    ⑤、当 c == ')': 结束当前() 内的运算,且将 Stack 中的栈顶两个元素出栈进行运算。

 

1     public int calculate3(String s) { 2         Stack
stack = new Stack<>(); 3 int result = 0, number = 0; 4 int sign = 1; 5 for (int i = 0; i < s.length(); i++) { 6 char c = s.charAt(i); 7 if(Character.isDigit(c)) { 8 number = number * 10 + (c - '0'); 9 }10 else if(c == '+') {11 result += sign * number;12 number = 0;13 sign = 1;14 }15 else if(c == '-') {16 result += sign * number;17 number = 0;18 sign = -1;19 }20 // 开始一次新的运算 ①、先记录之前值 ②、从新开始计数,因为 ( 之前必有 +或-,所以 number = 0 是默认的21 else if(c == '(') { 22 stack.push(result);23 stack.push(sign);24 sign = 1;25 result = 0;26 }27 // 结束当前一次计数, ①、先结束当前()内的运算,②、加上()之前的一次运算。28 else if(c == ')') {29 result += sign * number;30 result *= stack.pop();31 result += stack.pop();32 number = 0;33 }34 }35 if(number != 0)36 result += sign * number;37 return result;38 }

  

  优化: 每次将一个运算数单独处理完毕,与 ‘+’、‘-’ 号分开处理。

1 public int calculate(String s) { 2         Stack
stack = new Stack<>(); 3 int len = s.length(); 4 int sign = 1, result = 0; 5 for (int i = 0; i < len; i++) { 6 char ch = s.charAt(i); 7 if(Character.isDigit(ch)) { 8 int sum = ch - '0'; 9 while(i+1 < len && Character.isDigit(s.charAt(i+1))) {10 sum = sum * 10 + s.charAt(i + 1) - '0';11 i++;12 }13 result += sign * sum;14 }15 else if(ch == '+')16 sign = 1;17 else if(ch == '-')18 sign = -1;19 else if(ch == '(') {20 stack.push(result);21 stack.push(sign);22 result = 0;23 sign = 1;24 }25 else if(ch == ')') {26 result *= stack.pop();27 result += stack.pop();28 }29 }30 return result;31 }

 

转载于:https://www.cnblogs.com/skillking/p/9922943.html

你可能感兴趣的文章
Redhat linux C 函数 以及一些shell命令的 man rpm
查看>>
XenServer 6.0发布
查看>>
提高工作效率的方法之“20分钟理论”
查看>>
docker CE&&EE版本centos安装
查看>>
浅谈URL生成方式的演变
查看>>
Linux下ssl+http 实现 HTTPS 访问服务器设置
查看>>
磁盘与文件系统管理之五
查看>>
python学习-递归
查看>>
day:35:netfilter防火墙的管理工具firewalld及iptables备份恢复
查看>>
第六讲:用户界面 View(二)
查看>>
lsof用户及恢复日志文件
查看>>
Python之获取系统信息--(二)
查看>>
IE9,IE10不能显示@font-face定义的字体
查看>>
JSP----ISPI
查看>>
oracle 归档日志满了如何处理
查看>>
虚函数
查看>>
jsp当中引入静态文件
查看>>
登陆框post注入教程
查看>>
maven打包
查看>>
我的友情链接
查看>>