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日

相关文章

  • PyGame实现初始化导入所有模块方法详解

    PyGame是一款专门用于开发2D游戏的Python库,使用PyGame可以轻松地创建游戏窗口、处理图像、音频等多种功能。在使用PyGame开发游戏时,我们需要对PyGame进行初始化和导入所有需要的模块。下面是PyGame实现初始化导入所有模块方法的详细攻略。 初始化 PyGame中的初始化是必要的,它为开发者提供了一些必要的游戏环境设置。PyGame提供…

    other 2023年6月20日
    00
  • 关于java:替换字符串中的所有双引号

    简介 在Java中,可以使用replaceAll()方法来替换字符串中的所有双引号。该方法接受两个参数,第一个参数是要替换的字符串,第二个参数用于替换的字符串。本攻略将详细讲解如何使用replaceAll()方法替换字符串中的所有双引号。 步骤 下面使用replaceAll()方法来替换字符串中的所有双引号的步骤: 创建包含双引号的字符串。 使用replac…

    other 2023年5月8日
    00
  • win10没法开机怎么重装系统?电脑无法进入桌面也能重装Win10系统图文教程

    在遇到win10开机无法进入桌面的情况时,很多用户会选择重装系统来解决问题。但是,如果电脑已经无法进入桌面,又该怎样来重装Win10系统呢?下面就为大家讲解详细的操作步骤。 1. 准备工作 在进行重装之前,需要准备以下一些工作: 一台可以制作U盘启动盘的电脑; 一个2GB以上的U盘; 下载官方的Win10镜像文件并存储在电脑上; 保证电脑的BIOS已设置为从…

    other 2023年6月27日
    00
  • go-如何使用gccgo构建静态程序

    使用gccgo构建静态程序是Go语言的一种编译方式,可以将程序编译成静态可执行文件,方便在其他系统上运行。以下是使用gccgo构建静程序的完整攻略: 步骤一:安装gccgo 首先,需要安装gccgo。gccgo是GCC编译器的一部分用于编译Go程序。可以使用以下命令在Ubuntu系统上安装gccgo: sudo apt-get install gccgo 步…

    other 2023年5月8日
    00
  • 嵌入式移植docker报错问题(汇总)

    嵌入式移植Docker时,可能会遇到不少错误。本文将对一些常见的错误进行汇总及解决方法介绍,希望能帮助到大家。 一、问题1:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 这个问题通常是因为Docker daem…

    other 2023年6月27日
    00
  • SQL函数将某个字段合并在一起的操作

    对于SQL函数将某个字段合并在一起的操作,可以使用一些字符串函数将视图或者其他查询结果中的多个字段合并成一个字段。以下是常用的字符串函数: CONCAT()函数 该函数用于将多个字符串合并,与“+”运算符具有相同的功能。例如: SELECT CONCAT(‘Hello’, ‘, ‘, ‘World’); 执行结果为: Hello, World 可以将多个字段…

    other 2023年6月25日
    00
  • Python pygame派生精灵和精灵组创建敌机

    以下是详细讲解Python pygame派生精灵和精灵组创建敌机的完整攻略: 创建精灵类 在使用pygame创建精灵和精灵组之前,需要先创建一个基础精灵类,以便后续派生其他子类。 示例代码如下: import pygame class BaseSprite(pygame.sprite.Sprite): def __init__(self, image_pat…

    other 2023年6月26日
    00
  • nacos启动时闪退问题

    Nacos启动时闪退问题的解决方法 Nacos是一个开源的分布式服务发现和配置管理系统,可以帮助开发者更好地管理微服务架构中的服务注册、发现和配置。但是,在使用Nacos,有时会遇到启动时闪退的问题。以下是关于Nacos启动时闪退问题的解决方法的完整攻略。 问题描述 在启动Nacos时,可能会遇到闪退的问题。闪退的表现形式可能是控制台输出一些错误信息后退出,…

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