Java 最笨方法

四则运算

http://www.nowcoder.com/questionTerminal/9999764a61484d819056f807d2a91f1e

用两个栈来做,有些特殊情况需要考虑:
1、+, -, *, / 这四个符号前面有可能会省略0,比如:(-4*2),应该为(0-4*2),所以要在前面加个0,但是,还有中特殊情况不需要加0,比如:(4\2)-3,这种情况,'-'前面不需要加0。综上,只有前面是'(','[','{'这三种情况的话,才需要加0;
2、有大于10的数字存在,所以需要处理10以上情况,具体看代码。

简单说下步骤:

1、新建两个栈,一个栈用来存数字,一个栈用来存运算符
2、遍历整个字符串,如果是数字,入数字栈(考虑10以上情况);如果是普通运算符(考虑省略0情况),入运算符栈;如果是左括号('(', '[', '{'),入运算符栈;如果是右括号(')', ']', '}'),见第三步。
3、如果是右括号(')', ']', '}'),需要出栈操作,出栈到与对应的左括号匹配。我是这么做的,首先新建两个栈,用来存储第一次出栈结果,在出栈的过程中,只计算乘除操作,不计算加减。出栈结束后,新建的两个栈中会存储加减,那么再出栈新建的两个栈,计算加减操作。那么这次操作就是一次括号内的结果,将结果入栈数字栈。
4、第二步和第三步都结束后,那么输入的运算式就结束了,此时有可能运算符栈仍不为空,所以需要再计算运算符栈和数字栈中的结果

代码如下:
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String str = sc.next();
            Stack<Integer> stack1 = new Stack<Integer>(); // 用来存储数字
            Stack<Character> stack2 = new Stack<Character>(); // 用来存储运算符
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                if (Character.isDigit(c)) { // 读取到的字符为数字
                    if (i > 0 && Character.isDigit(str.charAt(i - 1))) {  // 考虑数字大于10的情况
                        stack1.push(stack1.pop() * 10 + (c - 48));
                    } else {
                        stack1.push(c - 48);
                    }
                } else {
                    if (c == ')') {
                        Stack<Integer> stack = new Stack<Integer>(); // 新建一个栈存储本次小括号内的结果
                        Stack<Character> option = new Stack<Character>(); // 新建一个栈存储小括号中的运算符
                        int count = 0;
                        int m = stack1.pop();
                        char o = stack2.pop();
                        while (o != '(') {
                            if (o == '*' || o == '/') { // 对于乘除,需要计算结果
                                int a = stack1.pop();
                                if (o == '*') {
                                    stack1.push(a * m);
                                } else {
                                    stack1.push(a / m);
                                }
                            } else if (o == '+' || o == '-') { // 对于加减,不需要计算结果
                                stack.push(m);
                                option.push(o);
                            }
                            m = stack1.pop();
                            o = stack2.pop();
                        }
                        count += m;
                        while (!option.empty()) { // 上面处理完后,再计算剩下的操作(加减)
                            char op = option.pop();
                            if (op == '+') {
                                count += stack.pop();
                            } else if (op == '-') {
                                count -= stack.pop();
                            }
                        }
                        stack1.push(count);
                    } else if (c == ']') {
                        Stack<Integer> stack = new Stack<Integer>();
                        Stack<Character> option = new Stack<Character>();
                        int count = 0;
                        int m = stack1.pop();
                        char o = stack2.pop();
                        while (o != '[') {
                            if (o == '*' || o == '/') {
                                int a = stack1.pop();
                                if (o == '*') {
                                    stack1.push(a * m);
                                } else {
                                    stack1.push(a / m);
                                }
                            } else if (o == '+' || o == '-') {
                                stack.push(m);
                                option.push(o);
                            }
                            m = stack1.pop();
                            o = stack2.pop();
                        }
                        count += m;
                        while (!option.empty()) {
                            char op = option.pop();
                            if (op == '+') {
                                count += stack.pop();
                            } else if (op == '-') {
                                count -= stack.pop();
                            }
                        }
                        stack1.push(count);
                    } else if (c == '}') {
                        Stack<Integer> stack = new Stack<Integer>();
                        Stack<Character> option = new Stack<Character>();
                        int count = 0;
                        int m = stack1.pop();
                        char o = stack2.pop();
                        while (o != '{') {
                            if (o == '*' || o == '/') {
                                int a = stack1.pop();
                                if (o == '*') {
                                    stack1.push(a * m);
                                } else {
                                    stack1.push(a / m);
                                }
                            } else if (o == '+' || o == '-') {
                                stack.push(m);
                                option.push(o);
                            }
                            m = stack1.pop();
                            o = stack2.pop();
                        }
                        count += m;
                        while (!option.empty()) {
                            char op = option.pop();
                            if (op == '+') {
                                count += stack.pop();
                            } else if (op == '-') {
                                count -= stack.pop();
                            }
                        }
                        stack1.push(count);
                    } else if (c == '+' || c == '-' || c == '*' || c == '/') {
                        if (i == 0 || (!Character.isDigit(str.charAt(i - 1)) && str.charAt(i - 1) != ')' && str.charAt(i - 1) != ']' && str.charAt(i - 1) != '}')) { // 考虑省略0的情况
                            stack1.push(0);
                        }
                        stack2.push(c);
                    } else {
                        stack2.push(c);
                    }
                }
            }
            if (!stack2.empty()) { // 有可能还未运算结束
                Stack<Integer> stack = new Stack<Integer>();
                Stack<Character> option = new Stack<Character>();
                int count = 0;
                int m = stack1.pop();
                char o = stack2.pop();
                while (!stack1.empty()) {
                    if (o == '*' || o == '/') {
                        int a = stack1.pop();
                        if (o == '*') {
                            stack1.push(a * m);
                        } else {
                            stack1.push(a / m);
                        }
                    } else if (o == '+' || o == '-') {
                        stack.push(m);
                        option.push(o);
                    }
                    m = stack1.pop();
                    if (stack2.empty()) {
                        break;
                    } else {
                        o = stack2.pop();
                    }
                }
                count += m;
                do {
                    char op = option.pop();
                    if (op == '+') {
                        count += stack.pop();
                    } else if (op == '-') {
                        count -= stack.pop();
                    }
                } while (!option.empty());
                System.out.println(count);
            } else {
                System.out.println(stack1.pop());
            }
        }
    }
}
全部评论
你已经超过66.66%的人了
1 回复 分享
发布于 2021-04-06 17:12
老哥已经很顶了
点赞 回复 分享
发布于 2022-04-26 23:16

相关推荐

2025-12-08 07:42
门头沟学院 Java
27届末九,由于是女生,身边人几乎没有就业导向的,自学只能跟着网课,没人指导,很迷茫。下图是我目前的简历,不知道有需要修改的地方吗?求拷打。下面是目前的学习情况:目前算法过完了一遍力扣100和代码随想录,不过不是很熟,面经看了小林coding、JavaGuide,有一些没用过的技术看得不是很明白,掌握得不是很扎实。再加上常年跟黑马网课听思路,真正自己动手写代码的时间很少,这让我一直不敢投简历,总觉得内里空虚。项目没准备好面试相关的问题,简历上相应的考点不熟。如此种种。。。看到很多很多学长学姐大佬们的面经,愈发觉得面试可怕,自己没准备好,总担心自己是不是无望后端开发了。看到牛客很多同届以及更小一届的同学都找到实习了,很希望自己也能找到实习。而自己又好像摸不到后端学习的门路,只能不断赞叹黑马虎哥写的代码真优雅!微服务架构实在巧妙!消息队列、redis、sentinel、nacos、mybatisplus等等的引入都会让我赞叹这些工具的设计者的巧思,以及包括但不限于Java语言的优雅。然而只是停留在了解的程度,并不熟练。我是很希望能够继续深入探索这些知识的,只不过有一大部分时间都花在学校课程上了。我感觉我被困住了,我一方面必须保证我能够有个不错的学业分使我能有我几乎不想选择的读研退路(还有个原因是复习不全我会焦虑考试挂科,因此我会做好全面的准备,而这一步很费时间),一方面在B站学习各种网课,一方面得考虑提升自己并不扎实的算法基础,另一方面还得准备八股面经。这让我有点苦恼,我好像没那么多时间,因为绝大部分时间都花在了复习学校科目中了。我好像处处用时间,但收效甚微。想问问各位大佬是怎么平衡时间的呢?算法、项目和八股是怎么准备的呢?有什么高效的方法吗?谢谢您们花时间阅读我的稿件!
菜菜狗🐶:大胆投,我当时也是害怕面试,投多了发现根本约不到面🤡
点赞 评论 收藏
分享
评论
6
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务