Q227 Basic Calculator II
2024-09-18 02:19:30
/*
看的答案,设置一个符号变量记录这个数前边的符号是什么,不同的符号进行不同的操作。这点自己想到了。
没想到的是由于乘除相当于一个优先级高的线程,所以要先处理,还有存取前一个乘数或者分子,应该怎么办。
答案用的是stack,利用先进后出的特点,当是乘除法时pop出前一个数,处理完乘除后再存取。
所以,以后遇到经常遇到前一个数值且不能在此次循环中及时处理时,可以用stack存取。
这里不能及时处理比如此题中处理完一连串乘除后才能加到最后结果上。虽然可以用list,但是应该比较麻烦
*/
//第一个数前边的符号默认是+
char sign = '+';
int res = 0;
//定义stack
Stack<Integer> stack = new Stack<>();
int l = s.length();
//可能有多位数,作为临时变量
int num = 0;
for (int i = 0;i < l;i++)
{
char c = s.charAt(i);
//这位是数的情况,如果连续式数,那么要把所有数组合为一个数
if (Character.isDigit(c))
{
//提取数字char真值的方法(不是char的ascii码):c - '0';
num = num*10 + c-'0';
}
//这一位是符号的情况,注意如果是最后一位那么也要处理,因为逻辑是遇到符号才计算前边的数,但是后一位后边没有符号
if (!Character.isDigit(c) && c != ' ' || i == l-1)
{
//根据这个数前边的符号进行不同操作
if (sign == '+')
stack.push(num);
if (sign == '-')
stack.push(-num);
if (sign == '*')
stack.push(stack.pop()*num);
if (sign == '/')
stack.push(stack.pop()/num);
num = 0;
//记录下这个符号,作为下一个数前边的符号
sign = c;
}
//空格跳过,不做任何操作
}
for (int n:stack)
res += n;
return res;
最新文章
- 腾讯开放平台 手机QQ登录 错误码:110406 解决办法
- G2 DT时代的图形语法 正式发布
- centos7时间同步和时区设置
- java二叉树的实现和遍历
- 【笔记】DOM探索基础篇(二)
- paper 37 : WINCE的BIB文件解析
- MetadataType的使用
- 挖潜无极限———数据挖掘技术与应用热点扫描[ZZ]
- 转: Apache SSI详解及应用
- 【ASP.NET Web API教程】2.3.3 创建Admin控制器
- [欧拉回路] hdu 3018 Ant Trip
- mfc---手动给toolbar按钮添加消息View中
- spring MVC处理请求过程及配置详解
- Bootstrap——一款超好用的前端框架
- 在Ubuntu上安装arm-linux-gcc的问题
- 【C++】二叉树的构建、前序遍历、中序遍历
- 把Oracle由归档模式改为非归档模式
- ZOJ 4067 - Books - [贪心][2018 ACM-ICPC Asia Qingdao Regional Problem J]
- 2017年最新20个轻量的 JavaScript 库和插件
- rem,em