Java利用栈实现简单计算器功能

简介: 利用栈,如何能够实现计算器的功能,可以利用栈“先进先出”的特点。

利用栈,实现简单计算器功能

计算的数中 不能带括号.每行代码的功能,里面都备注的很清楚了
import java.util.Stack;
public class Calculator {
    public static void main(String[] args) {
        String s = "143+42+12*70-21+50";
        Stack<Character> operStack = new Stack<>();
        Stack<Integer> numStack = new Stack<>();
        int index = 0;
        String num = "";
        int num1, num2;
        while (true) {
            //利用循环一次一次的  从字符串中取
            char c = s.charAt(index);
            if (isOper(c)) {
                //如果c是运算符的话,执行这里
                if (operStack.isEmpty()) {
                    //判断运算符栈是否为空,为空的话直接把运算符加进去就好
                    operStack.push(c);
                } else {
                    //如果是运算符判断运算符的优先级
                    if (priority(c) <= priority(operStack.peek())) {
                        //如果该运算符  的优先级  小于或等于  栈顶元素的优先级
                        //取出两个数字栈中的数据  和 一个运算符栈中的数据  进行运算
                        //让后将运算结果 加入到数字栈中,将这个运算符加入到运算符栈中
                        num1 = numStack.pop();
                        num2 = numStack.pop();
                        numStack.push(cal(num1, num2, operStack.pop()));
                        operStack.push(c);
                    } else {
                        operStack.push(c);
                    }
                }
            } else {
                //如果c不是运算符的话执行这里
                num += c;
                //如果是多位数的话,需要判断数的位数
                if (index == s.length() - 1) {
                    numStack.push(Integer.parseInt(num));
                    num = "";
                } else {
                    //判断这个数字的下一个是不是 字符,如果是就把前面的字符 就把前面的数字加入到数字栈中
                    if (isOper(s.charAt(index + 1))) {
                        numStack.push(Integer.parseInt(num));
                        num = "";
                    }
                }
            }

            index++;
            if (index >= s.length()) {
                break;
            }
        }

        //将所有的 字符都入栈之后,进行计算
        //运算结束的条件(满足其中之一就可以)
        //1.数字栈中只剩下一个数字
        //2.运算符栈中没有运算符
        while (!operStack.isEmpty()) {
            num1 = numStack.pop();

            num2 = numStack.pop();
            numStack.push(cal(num1, num2, operStack.pop()));
        }
        System.out.printf("%s的运算结果为:%d", s, numStack.pop());
    }

    //判断是不是运算符
    static boolean isOper(char c) {
        if (c == '+' || c == '-' || c == '*' || c == '/' || c == 'x') {
            return true;
        }
        return false;
    }

    //判断运算符的优先级
    static int priority(char c) {
        if (c == '*' || c == '/' || c == 'x') {
            return 1;
        } else if (c == '+' || c == '-') {
            return 0;
        } else {
            return -1;
        }
    }

    //算数运算
    static int cal(int x, int y, char oper) {
        switch (oper) {
            case '+':
                return x + y;
            case '-':
                return y - x;
            case '*':
            case 'x':
                return x * y;
            case '/':
                return y / x;
            default:
                return -1;
        }
    }
}

如果想看更复杂的计算器,请看我的其它文章.

目录
相关文章
|
22天前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
103 60
|
10天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
21 2
|
24天前
|
存储 算法 Java
🧠Java零基础 - Java栈(Stack)详解
【10月更文挑战第17天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
17 2
|
1月前
|
Java 程序员
在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。
【10月更文挑战第13天】在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。本文介绍了Java关键字的基本概念及其重要性,并通过定义类和对象、控制流程、访问修饰符等示例,展示了关键字的实际应用。掌握这些关键字,是成为优秀Java程序员的基础。
24 3
|
1月前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
58 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
1月前
|
机器学习/深度学习 算法 Java
通过 Java Vector API 利用 SIMD 的强大功能
通过 Java Vector API 利用 SIMD 的强大功能
43 10
|
1月前
|
Oracle 安全 Java
Java 22 为开发人员带来了重大增强功能
Java 22 为开发人员带来了重大增强功能
38 9
|
1月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
25 1
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
30 2