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;
        }
    }
}

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

目录
相关文章
|
5天前
|
存储 监控 安全
JVM工作原理与实战(十六):运行时数据区-Java虚拟机栈
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了运行时数据区、Java虚拟机栈等内容。
11 0
|
10天前
|
存储 前端开发 搜索推荐
13:Session机制实现用户登录与注销功能-Java Web
13:Session机制实现用户登录与注销功能-Java Web
25 3
|
10天前
|
安全 前端开发 Java
10:基于Servlet模拟用户登录功能的实现与解析-Java Web
10:基于Servlet模拟用户登录功能的实现与解析-Java Web
24 3
|
10天前
|
存储 监控 Java
如何在Java中实现等待文件修改后再读取数据的功能?
如何在Java中实现等待文件修改后再读取数据的功能?
18 0
|
12天前
|
Java API 数据安全/隐私保护
【亮剑】如何在Java项目中结合Spring框架实现邮件发送功能
【4月更文挑战第30天】本文介绍了如何在Java项目中结合Spring框架实现邮件发送功能。首先,需在`pom.xml`添加Spring和JavaMail依赖。然后,在`applicationContext.xml`配置邮件发送器,包括SMTP服务器信息。接着,创建一个使用依赖注入的`EmailService`类,通过`JavaMailSender`发送邮件。最后,调用`EmailService`的`sendSimpleEmail`方法即可发送邮件。最佳实践包括:使用配置管理敏感信息,利用`MimeMessage`构造复杂邮件,异常处理和日志记录,以及在大量发送时考虑使用邮件队列。
|
12天前
|
分布式计算 DataWorks 监控
DataWorks操作报错合集之DataWorks在调用java sdk的createFile功能时报错com.aliyuncs.exceptions.ClientException: 1201111000 如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
12 1
|
16天前
|
缓存 Java 测试技术
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
|
17天前
|
Java API
java流式实现chatGPT会话功能
java流式实现chatGPT会话功能
24 1
|
18天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
|
18天前
|
存储 算法 安全
Java集合篇之逐渐被遗忘的Stack,手写一个栈你会吗?
Java集合篇之逐渐被遗忘的Stack,手写一个栈你会吗?
17 0