Java用栈实现综合计算器

yizhihongxing

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日

相关文章

  • php+Ajax无刷新验证用户名操作实例详解

    PHP+Ajax无刷新验证用户名操作实例详解 在网站开发中,常常需要验证用户名是否可用,一般的做法是提交表单后在服务器端进行验证,再返回结果给前端页面。但这种方式会引起页面的刷新,体验不够友好。本文将介绍使用PHP+Ajax技术实现无刷新验证用户名的方法。 实现原理 使用Ajax技术,监听用户名文本框的键入事件,将文本框中的内容发送到服务器端进行验证。服务器…

    other 2023年6月27日
    00
  • C++语言实现拼图游戏详解

    C++语言实现拼图游戏详解 一、背景介绍 拼图游戏是一种流行的益智游戏,玩家需要将一张拆散的图片拼合起来,形成完整的图片。随着数字游戏的流行,用程序实现拼图游戏成为了很有意义的一项工作。本文将详细介绍如何使用 C++ 语言实现拼图游戏。 二、实现过程 1. 图片处理 图片处理是实现拼图游戏的第一步。这里我们需要将待拼图的图片切割成小块,以便之后的拼图操作。可…

    other 2023年6月26日
    00
  • logback 实现给变量指定默认值

    Logback 实现给变量指定默认值攻略 在 Logback 中,可以使用 <defaultValue> 元素来为变量指定默认值。当变量没有被设置时,将会使用默认值。下面是详细的攻略,包含两个示例说明。 步骤一:配置 Logback 上下文 首先,需要在 Logback 配置文件中配置 Logback 上下文。通常,这个配置文件是 logback…

    other 2023年8月9日
    00
  • Python机器学习库scikit-learn入门开发示例

    当涉及到使用Python机器学习库scikit-learn进行入门开发时,以下是一个完整的攻略,其中包含两个示例说明: 1. 安装和导入scikit-learn 首先,确保已经安装了scikit-learn库。可以使用pip命令进行安装: pip install scikit-learn 安装完成后,可以在Python脚本中导入scikit-learn库: …

    other 2023年10月18日
    00
  • 浅谈mysql explain中key_len的计算方法

    当涉及到MySQL的EXPLAIN命令中key_len的计算方法时,以下是一个完整的攻略,其中包含两个示例说明: 1. key_len的计算方法 key_len是指索引字段的最大长度,它在EXPLAIN结果中提供了有关索引使用情况的信息。下面是计算key_len的方法: 对于定长字段(如整数类型),key_len等于字段的字节数。 对于变长字段(如字符串类型…

    other 2023年10月18日
    00
  • 用js对json加密解密

    用 JS 对 JSON 加密解密 在现代开发中,JSON 的使用非常普遍,它是一种轻量级的数据交换格式,被广泛应用于前后端数据传递、API 接口设计、存储文本数据等方面。然而,JSON 本身的文本格式对于敏感信息的保护来说并不太友好。这时,我们需要使用加密算法对 JSON 数据进行加密,以确保敏感信息不会被破解的同时,又可以方便地进行传输和解密。 在本文中,…

    其他 2023年3月28日
    00
  • 关于表格table嵌套,边框合并问题的解决方法

    关于表格table嵌套,边框合并问题的解决方法,主要包括两个方面:一是如何给表格单元格添加边框,二是如何合并单元格边框。 1. 如何给表格单元格添加边框 在HTML中,我们可以使用以下CSS属性为表格单元格添加边框: border: 用于设置单元格的组合边框,可以设置边框的宽度、样式和颜色。 border-collapse: 用于控制表格的边框是否合并,可以…

    other 2023年6月27日
    00
  • 手把手教你使用python抓取qq音乐数据

    当然,我很乐意为您提供有关“使用Python抓取QQ音乐数据”的完整攻略。以下是详细的步骤和两个示例: 1 使用Python抓取QQ音乐数据 Python是一种流行的编程语言,可以用于抓取网站数据。在本攻略中,我们将使用Python抓取QQ音乐数据。 2 抓取QQ音乐数据的步骤 以下是使用Python抓取QQ音乐数据的步骤: 2.1 安装requests和b…

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