Java用栈实现综合计算器

Java用栈实现综合计算器攻略

本攻略将详细介绍如何使用Java中的栈数据结构来实现一个综合计算器。该计算器可以处理基本的四则运算,并支持括号的嵌套。

步骤一:创建栈类

首先,我们需要创建一个栈类来实现栈的基本功能。可以使用Java中的ArrayList来模拟栈的行为。以下是一个简单的栈类示例:

import java.util.ArrayList;

public class Stack {
    private ArrayList<Character> stack;

    public Stack() {
        stack = new ArrayList<>();
    }

    public void push(char c) {
        stack.add(c);
    }

    public char pop() {
        if (isEmpty()) {
            throw new IllegalStateException(\"Stack is empty\");
        }
        return stack.remove(stack.size() - 1);
    }

    public char peek() {
        if (isEmpty()) {
            throw new IllegalStateException(\"Stack is empty\");
        }
        return stack.get(stack.size() - 1);
    }

    public boolean isEmpty() {
        return stack.isEmpty();
    }
}

步骤二:实现综合计算器

接下来,我们将使用上述栈类来实现综合计算器。以下是一个示例的综合计算器类:

public class Calculator {
    private Stack operatorStack;
    private Stack operandStack;

    public Calculator() {
        operatorStack = new Stack();
        operandStack = new Stack();
    }

    public int evaluate(String expression) {
        for (int i = 0; i < expression.length(); i++) {
            char c = expression.charAt(i);
            if (Character.isDigit(c)) {
                operandStack.push(c);
            } else if (c == '(') {
                operatorStack.push(c);
            } else if (c == ')') {
                while (operatorStack.peek() != '(') {
                    evaluateExpression();
                }
                operatorStack.pop(); // 弹出左括号
            } else if (isOperator(c)) {
                while (!operatorStack.isEmpty() && precedence(operatorStack.peek()) >= precedence(c)) {
                    evaluateExpression();
                }
                operatorStack.push(c);
            }
        }

        while (!operatorStack.isEmpty()) {
            evaluateExpression();
        }

        return Integer.parseInt(String.valueOf(operandStack.pop()));
    }

    private void evaluateExpression() {
        char operator = operatorStack.pop();
        int operand2 = Integer.parseInt(String.valueOf(operandStack.pop()));
        int operand1 = Integer.parseInt(String.valueOf(operandStack.pop()));
        int result = performOperation(operand1, operand2, operator);
        operandStack.push((char) result);
    }

    private boolean isOperator(char c) {
        return c == '+' || c == '-' || c == '*' || c == '/';
    }

    private int precedence(char operator) {
        if (operator == '+' || operator == '-') {
            return 1;
        } else if (operator == '*' || operator == '/') {
            return 2;
        }
        return 0;
    }

    private int performOperation(int operand1, int operand2, char operator) {
        switch (operator) {
            case '+':
                return operand1 + operand2;
            case '-':
                return operand1 - operand2;
            case '*':
                return operand1 * operand2;
            case '/':
                return operand1 / operand2;
            default:
                throw new IllegalArgumentException(\"Invalid operator\");
        }
    }
}

示例说明

以下是两个示例说明,展示了如何使用上述综合计算器类进行计算:

示例一

Calculator calculator = new Calculator();
String expression = \"2 + 3 * 4 - (5 + 6)\";
int result = calculator.evaluate(expression);
System.out.println(\"结果:\" + result);

输出结果为:

结果:9

示例二

Calculator calculator = new Calculator();
String expression = \"(3 + 4) * 2 / (1 + 5)\";
int result = calculator.evaluate(expression);
System.out.println(\"结果:\" + result);

输出结果为:

结果:2

以上就是使用Java栈实现综合计算器的完整攻略。通过创建栈类和综合计算器类,我们可以轻松地处理基本的四则运算和括号嵌套。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java用栈实现综合计算器 - Python技术站

(0)
上一篇 2023年8月6日
下一篇 2023年8月6日

相关文章

  • fedora20安装hadoop-2.5.1

    Fedora 20上安装Hadoop-2.5.1 Hadoop是一个开源的分布式系统框架,用于处理大规模数据的存储和计算。本文介绍了在Fedora 20系统上安装Hadoop-2.5.1的步骤以及可能遇到的问题和解决方法。 安装Java Hadoop是用Java编写的,因此需要先安装JDK。 打开终端,输入以下命令安装JDK: bash sudo dnf i…

    其他 2023年3月28日
    00
  • 《c程序设计语言》k&r版

    《C程序设计语言》K&R版 《C程序设计语言(英文版)》是由美国计算机科学家布莱恩·柯林汉(Kernighan)和丹尼斯·里奇(Ritchie)所著的一本经典的C语言教材,也被称为“K&R C”。这本书于1978年首次出版,至今已成为学习C语言必读的经典书籍。 本书系统地介绍了C语言的基本语法、数据类型、运算符、流程控制语句、函数、指针、数组…

    其他 2023年3月28日
    00
  • 机器人操作系统(ros)教程4:ros的框架

    机器人操作系统(ROS)教程4: ROS的框架的完整攻略 ROS是一个灵活的框架,可以用于构建各种类型的机器人应用程序。本文将介绍ROS的框架,包括两个示例说明。 步骤一:安装ROS 在使用ROS之前,需要先安装ROS。可以使用以下命令在Ubuntu系统中安装ROS: sudo apt-get update sudo apt-get install ros-…

    other 2023年5月9日
    00
  • Android中WebView加载网页设置进度条

    Android中WebView加载网页设置进度条攻略 在Android中,我们可以使用WebView来加载网页,并通过设置进度条来显示加载进度。下面是一个详细的攻略,包含了两个示例说明。 步骤一:添加WebView和ProgressBar到布局文件 首先,在你的布局文件中添加一个WebView和一个ProgressBar,用于显示网页内容和加载进度。以下是一…

    other 2023年8月24日
    00
  • iphone6 plus死机怎么办?苹果6 plus死机重启解决方法详解

    iPhone6 Plus死机怎么办? 什么是iPhone6 Plus死机? iPhone6 Plus死机指的是设备无法响应任何操作,甚至是关机也无法完成的情况。这时候你需要重新启动设备来解决问题。 iPhone6 Plus死机重启方法 以下是iPhone6 Plus死机重启方法的详细介绍。 方法1:硬重启 硬重启指的是通过按下特定的物理按键来强制让设备重启。…

    other 2023年6月27日
    00
  • 如何改变placeholder的样式

    如何改变placeholder的样式 在Web开发中,placeholder 用于在输入框中展示默认提示内容,比如搜索框中的“请输入关键字”。默认情况下,placeholder 的样式和输入框的文本样式一致,如果想要将其样式修改为特殊样式,则需要对其进行单独的样式设置。 下面是一些方法: 1.使用 ::placeholder 伪元素 ::placeholde…

    其他 2023年3月28日
    00
  • 常用dos命令及语法

    下面是我为您准备的“常用DOS命令及语法”攻略。 常用DOS命令及语法 在Windows操作系统中,DOS命令是非常重要和常用的工具。下面列举一些常用的DOS命令及其对应的语法和功能。 1. dir命令 dir命令用于列出指定目录下的所有文件和子目录。 语法: dir [drive:][path][filename] [/A[[:]attributes]] …

    other 2023年6月26日
    00
  • JS构造函数和实例化的关系及原型引入

    JS中,构造函数是用于创建对象的特殊函数,用更直白的语言解释,构造函数其实就是一个模板,可以用来创建具有相同属性和方法的多个对象。 在JS中,我们可以通过函数的方式来创建一个构造函数,代码如下: function Person(name, age) { this.name = name; this.age = age; this.getInfo = func…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部