字符串得结果!Java数组模拟栈以实现中缀表达式综合计算器,字符串表达式计算器

简介: 字符串得结果!Java数组模拟栈以实现中缀表达式综合计算器,字符串表达式计算器

文章目录


数组模拟栈类

中缀表达式计算器类(测试类)


数组模拟栈类


主要实现栈的一些基本功能,以及在该场景下的功能。


//先创建一个栈
class AStack {
    private int maxSize; //栈的大小
    private int[] stack; //数组模拟栈
    private int top = -1; //栈顶,初始化-1
    //构造器
    public AStack(int maxSize) {
        this.maxSize = maxSize;
        stack = new int[maxSize];
    }
    //栈满
    public boolean isFull(){
        return top == maxSize - 1;
    }
    //栈空
    public boolean isEmpty(){
        return top == -1;
    }
    //入栈
    public void push(int value){
        if (isFull()){
            System.out.println("栈满,入栈失败!");
            return;
        }
        top++;
        stack[top] = value;
    }
    //出栈
    public int pop(){
        if (isEmpty()){
            throw new RuntimeException("栈空,出栈失败!");
        }
        return stack[top--]; //先得到stack[top],然后top--
    }
    //返回栈顶值
    public int peek(){
        return stack[top];
    }
    //遍历(从栈顶向下)
    public void show(){
        if (isEmpty()){
            System.out.println("栈空!");
            return;
        }
        for (int i = top; i >= 0; i--) {
            System.out.printf("stack[%d] = %d\n",i,stack[i]);
        }
    }
    //返回运算符优先级(约定数值越大,优先级越高)
    public int priority(char operator){
        if (operator == '*' || operator == '/'){
            return 1;
        }else if (operator == '+' || operator == '-'){
            return 0;
        }else return -1; //假设只有加减乘除
    }
    //判断是不是运算符
    public boolean isOperator(char value){
        return value == '+' || value == '-' || value == '*' || value == '/';
    }
    //两数计算方法
    public int cal(int num1,int num2,char operator){
        int result = 0; //计算结果
        switch (operator){
            case '+':
                result = num2 + num1;
                break;
            case '-':
                result = num2 - num1;
                break;
            case '*':
                result = num2 * num1;
                break;
            case '/':
                result = num2 / num1;
                break;
        }
        return result;
    }
}


中缀表达式计算器类(测试类)


主要实现计算的逻辑。


public class Calculate {
    public static void main(String[] args) {
        String expression = "5+40*4-3"; //162
        AStack numStack = new AStack(10); //数栈
        AStack opeStack = new AStack(5); //运算符栈
        //定义需要的变量
        int index = 0; //用于扫描表达式
        int num1 = 0;
        int num2 = 0;
        int ope = 0;
        int res = 0; //用于临时保存两数运算结果
        char ch = ' '; //每次扫描得到的字符
        String keepNum = ""; //用于拼接多位数
        //扫描表达式
        while (true){
            //扫描一个表达式字符
            ch = expression.substring(index,index+1).charAt(0);
            //判断ch是数还是运算符,并处理
            if (opeStack.isOperator(ch)) {
                //是运算符
                if (opeStack.isEmpty()){
                    //运算符栈为空,直接入栈
                    opeStack.push(ch);
                }else {
                    //不为空
                    if (opeStack.priority(ch) > opeStack.priority((char) opeStack.peek())){
                        //新的运算符优先级大于栈顶运算符的优先级,直接入栈
                        opeStack.push(ch);
                    }else {
                        //小于等于,则数栈pop两个,运算符栈pop一个进行运算,将结果入数栈、新运算符入运算符栈
                        num1 = numStack.pop();
                        num2 = numStack.pop();
                        ope = opeStack.pop();
                        res = numStack.cal(num1,num2, (char) ope);
                        numStack.push(res);
                        opeStack.push(ch);
                    }
                }
            }else {
                //是数
                keepNum += ch;
                if (index == expression.length() - 1){
                    numStack.push(Integer.parseInt(keepNum));
                }else {
                    if (numStack.isOperator(expression.substring(index+1,index+2).charAt(0))){
                        //后一位是运算符,则当前的可以直接入数栈
                        numStack.push(Integer.parseInt(keepNum));
                        keepNum = ""; //清空
                    }
                }
            }
            index++;
            if (index >= expression.length()){
                //扫描到最后
                break;
            }
        }
        //扫描结束,就顺序pop运算符栈和数栈进行运算,如何每次将结果入数栈
        while (true){
            if (opeStack.isEmpty()){
                //运算符栈为空,则运算结束
                break;
            }
            num1 = numStack.pop();
            num2 = numStack.pop();
            ope = opeStack.pop();
            res = numStack.cal(num1,num2, (char) ope);
            numStack.push(res);
        }
        //数栈最后一个数即为表达式结果
        System.out.printf("表达式 %s = %d",expression,numStack.pop());
    }
}



相关文章
|
5月前
|
SQL JSON Java
告别字符串拼接:用Java文本块优雅处理多行字符串
告别字符串拼接:用Java文本块优雅处理多行字符串
458 108
|
5月前
|
Java
Java 数组学习笔记
本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
|
5月前
|
小程序 Java 知识图谱
Java 学习笔记 —— BMI & BMR 计算器
这是一个使用 Java 编写的 BMI 与 BMR 计算器小程序,可输入年龄、性别、身高和体重,计算身体质量指数(BMI)和基础代谢率(BMR),并输出健康评估结果。通过该项目,掌握了 Java 的输入处理、数据验证、条件判断、数学运算及格式化输出等基础知识,是 Java 初学者的理想练习项目。
|
6月前
|
Java 编译器 API
Java Lambda表达式与函数式编程入门
Lambda表达式是Java 8引入的重要特性,简化了函数式编程的实现方式。它通过简洁的语法替代传统的匿名内部类,使代码更清晰、易读。本文深入讲解Lambda表达式的基本语法、函数式接口、方法引用等核心概念,并结合集合操作、线程处理、事件回调等实战案例,帮助开发者掌握现代Java编程技巧。同时,还解析了面试中高频出现的相关问题,助你深入理解其原理与应用场景。
|
6月前
|
存储 缓存 Java
Java数组全解析:一维、多维与内存模型
本文深入解析Java数组的内存布局与操作技巧,涵盖一维及多维数组的声明、初始化、内存模型,以及数组常见陷阱和性能优化。通过图文结合的方式帮助开发者彻底理解数组本质,并提供Arrays工具类的实用方法与面试高频问题解析,助你掌握数组核心知识,避免常见错误。
|
6月前
|
安全 Java API
Java中的Lambda表达式:简洁与功能的结合
Java中的Lambda表达式:简洁与功能的结合
497 211
|
Java Unix 数据库管理
java定时框架:表达式设置
Quartz中时间表达式的设置-----corn表达式 (注:这是让我看比较明白的一个博文,但是抱歉,没有找到原作者,如有侵犯,请告知)   时间格式: ,   分别对应: 秒>分>小时>日>月>周>年,  举例: 1.
980 0
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
249 1