题目描述:

给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。

示例 1:

输入: "2-1-1"
输出: [0, 2]
解释:
((2-1)-1) = 0
(2-(1-1)) = 2

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/different-ways-to-add-parentheses

解题思路:

  1、每次仅运算乘除,将运算结果入栈,

    a、保留前一个运算符

    b、如果前一个运算符是乘除,弹出一个数字,与当前运算,结果回送。

    c、如果是减号,将当前数字取负,送进堆栈;正号,直接入栈

  2、扫描结束后,对栈中所有元素求和。结束

java语言实现:

 class Solution {
public static int calculate(String s) {
int res = 0;
int num = 0;
char sign = '+';
Stack<Integer> stack = new Stack<>();
char[] sarr = s.toCharArray();
for (int i = 0; i < sarr.length; i++) {
if (sarr[i] >= '0') {
num = num * 10 + sarr[i] - '0'; // 注意字符变成数字,方可参加运算,否则直接ASCII码参与运算,出错。
}
if ((sarr[i] < '0' && sarr[i] != ' ') || i == sarr.length - 1) {
if (sign == '+') {
stack.push(num);
} else if (sign == '-') {
stack.push(-num);
} else if (sign == '*' || sign == '/') {
int top = stack.pop();
stack.push(sign == '*' ? top * num : top / num);
}
sign = sarr[i];
num = 0;
}
}
while (!stack.isEmpty()) {
res += stack.pop();
}
return res;
} public static int calculate2(String s) {
   s=s.trim(); //清洗输入数据,并记得将洗过的数据回送给s
java.util.Stack<Integer> stack = new java.util.Stack<>();
// String[] nums=s.split("[-+/*]");
int left_number=0;
char fuhao_before='+'; //保存前一个符号
char fuhao;
for (int i=0;i<s.length();i++){
if (Character.isDigit(s.charAt(i))){
left_number=left_number*10+s.charAt(i)-'0'; }if(i==s.length()-1 || ! Character.isDigit(s.charAt(i))){
fuhao=s.charAt(i);
switch (fuhao_before){
case '+':
stack.push(left_number);
fuhao_before=fuhao;
break;
case '-':
stack.push(-left_number);
fuhao_before=fuhao;
break;
case '*':
stack.push(stack.pop()*left_number); //其实是右边的数
fuhao_before=fuhao;
break;
case '/':
stack.push(stack.pop()/left_number);
fuhao_before=fuhao;
break;
default:
break; }
left_number=0; //归零
}
} int result=0;
while (! stack.empty()){
result+=stack.pop(); }
return result;
}
}

算法刷题笔记-stack-四则运算的更多相关文章

  1. 《Data Structures and Algorithm Analysis in C》学习与刷题笔记

    <Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...

  2. Python 刷题笔记

    Python 刷题笔记 本文记录了我在使用python刷题的时候遇到的知识点. 目录 Python 刷题笔记 选择.填空题 基本输入输出 sys.stdin 与input 运行脚本时传入参数 Pyth ...

  3. PTA刷题笔记

    PTA刷题记录 仓库地址: https://github.com/Haorical/Code/tree/master/PTA/GPLT 两周之内刷完GPLT L2和L3的题,持续更新,包括AK代码,坑 ...

  4. PAT-甲级刷题笔记和总结

     本帖主要记录一些自己在刷题过程中的一些笔记,包括: 1.常用的函数 2.STL中常用方法 3.常见错误 4.其他常用方法 5.刷题过程中的常见算法:https://www.cnblogs.com/M ...

  5. NOI题库分治算法刷题记录

    今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...

  6. leetcode 算法刷题(一)

    今天开始刷Leetcode上面的算法题.我会更新我刷题过程中提交的代码(成功和不成功的都有)和比较好的解法 第二题 Add Two Numbers 题目的意思:输入两个链表,这两个链表都是倒序的数字, ...

  7. 18.9.10 LeetCode刷题笔记

    本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...

  8. LeetCode刷题笔记和想法(C++)

    主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...

  9. LeetCode刷题笔记 - 12. 整数转罗马数字

    学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...

随机推荐

  1. 将windows下的文件上传到Linux服务器上

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lx_Frolf/article/deta ...

  2. python深浅拷贝的理解和区分

    import copy a1 = ['s1','s2','s3'] #可变数据类型 a = [1,2,a1] b = a a1.append('s4') #浅拷贝 c = copy.copy(a) # ...

  3. [USACO 07NOV]电话线Telephone Wire

    题目描述 Farmer John's cows are getting restless about their poor telephone service; they want FJ to rep ...

  4. Intellij Idea乱码解决方案都在这里了

    乱码场景 使用Intellij Idea经常遇到乱码问题,可以总结为以下几类乱码的场景. 1.工程代码乱码. 2.main方法运行,控制台乱码. 3.tomcat运行,控制台乱码. 解决方案 1.工程 ...

  5. webstorm的下载、破解、与汉化

    其实很简单的事情,都被我弄复杂了倒腾了很久,特做个记录. 说明前提,版本为 webstorm 2018.1.4 一.下载webstorom 下载地址:当然去官网啊  https://www.jetbr ...

  6. 【目录】linux 编程

    随笔分类 - linux 编程 Linux编程 24 shell编程(结构化 if [ condition ] 数值比较,字符串比较) 摘要: 一.概述 接着上篇讲的结构化命令,最后讲到了test命令 ...

  7. js转换成字符串

    有两种方法: 1.对于boolean, number, string类型,可调用toString()方法 2.用String(var)方法 其中,第二种方法使用范围更广,可将没有toString()方 ...

  8. showfont - 展示当前"显示屏-字体 映射"中的所有字符.

    总览 showfont 描述 showfont 利用8-bit控制台模式的 Application Charset Map(应用字符集映射) 中一些连续的开关, 以当前字体在屏幕上展示所有的256个或 ...

  9. java中数据库和VO的一一对应关系

    如图所示,数据库中数据如果有下划线,则JavaVO中删除,除第一个单词外,其他单词首字母大写

  10. [转]C# CancellationTokenSource 终止线程

    我们在多线程中通常使用一个bool IsExit类似的代码来控制是否线程的运行与终止,其实使用CancellationTokenSource来进行控制更为好用,下面我们将介绍CancellationT ...