字符串得结果!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());
    }
}



相关文章
|
2月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
153 83
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
64 26
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
64 5
|
1月前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
70 8
|
2月前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
2月前
|
并行计算 Java 编译器
深入理解Java中的Lambda表达式
在Java 8中引入的Lambda表达式,不仅简化了代码编写,还提升了代码可读性。本文将带你探索Lambda表达式背后的逻辑与原理,通过实例展示如何高效利用这一特性优化你的程序。
|
2月前
|
搜索推荐 Java API
探索Java中的Lambda表达式
本文将深入探讨Java 8引入的Lambda表达式,这一特性极大地简化了代码编写,提高了程序的可读性。通过实例分析,我们将了解Lambda表达式的基本概念、使用场景以及如何优雅地重构传统代码。文章不仅适合初学者,也能帮助有经验的开发者加深对Lambda表达式的理解。
|
1月前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
2月前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
33 0