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

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

目录
相关文章
|
1月前
|
运维 监控 JavaScript
JAVA村卫生室、诊所云HIS系统源码 支持医保功能
运维运营分系统 1、系统运维:环境管理、应用管理、菜单管理、接口管理、任务管理、配置管理 2、综合监管:统计监管的医疗机构的综合信息,包括医疗业务量、人员配备量、支付分类占比等。 3、系统运营:机构管理、药品目录管理、用户管理、角色管理、字典管理、模板管理、消息管理、运营配置、售后服务、外部系统。
30 0
|
1月前
|
存储 Java 数据安全/隐私保护
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
36 0
|
1月前
|
安全 Java 数据库连接
【Java每日一题】——第四十四题:综合案例:编程模拟智能手机和普通手机功能。
【Java每日一题】——第四十四题:综合案例:编程模拟智能手机和普通手机功能。
56 0
|
1天前
|
Java API
java流式实现chatGPT会话功能
java流式实现chatGPT会话功能
7 1
|
1月前
|
存储 Java API
Java统计功能
Java统计功能
14 0
|
1月前
|
存储 搜索推荐 Java
Java筛选功能的秘密
Java筛选功能的秘密
12 0
|
1月前
|
存储 算法 安全
Java代码能实现这些隐藏的加密功能
Java代码能实现这些隐藏的加密功能
58 0
|
1月前
|
Java
Java代码打造直播互动功能
Java代码打造直播互动功能
12 1
|
1月前
|
Java 关系型数据库 MySQL
Java调用shell脚本实现数据库备份功能
本篇文章主要介绍怎样使用Java程序,执行服务器上的数据库备份Shell脚本进行MySQL数据库的备份功能。