本程序实现了简单的加减乘除运算,可对小数、整数、负数实现运算。

本程序的算数运算使用栈实现,一个操作符栈和一个操作数栈。

本程序允许的操作符为+、-、*、/、英文左括号(“(”),英文右括号(“)”)。


JavaFX界面程序如下:

package collection;import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;import java.util.Stack;public class EvaluateExpression extends Application {private TextField expression = new TextField(); //表达式private TextField result = new TextField(); //结果值private Button evaluate = new Button("Evaluate");   //计算按钮private Button clear = new Button("Clear"); //清除public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage primaryStage) throws Exception {GridPane gridPane = new GridPane(); //网格面板添加文本域对象gridPane.setStyle("-fx-hgap: 5px; -fx-vgap: 5px; -fx-padding: 5px;");gridPane.addRow(0, new Label("Enter an expression:"), expression);gridPane.addRow(1, new Label("Result:"), result);expression.setAlignment(Pos.BOTTOM_RIGHT);  //文本域设置对齐result.setAlignment(Pos.BOTTOM_RIGHT);result.setEditable(false);EventHandler<ActionEvent> eventHandler = event -> { //计算表达式处理器try {result.setText(format(evaluateExpression(expression.getText().trim())));} catch (Exception ex) {}};expression.setOnAction(eventHandler);   //文本域、按钮注册处理器evaluate.setOnAction(eventHandler);clear.setOnAction(event -> {expression.setText(""); result.setText("");});HBox hBox = new HBox(10, evaluate, clear);  //水平面板添加按钮hBox.setAlignment(Pos.CENTER);BorderPane pane = new BorderPane(gridPane);pane.setBottom(hBox);Scene scene = new Scene(pane);primaryStage.setScene(scene);primaryStage.setTitle("EvaluateExpression");primaryStage.show();}/** 计算表达式 */public static double evaluateExpression(String expression) {Stack<Double> operandStack = new Stack<>(); //操作数栈Stack<Character> operatorStack = new Stack<>(); //操作符栈expression = formatExpression(expression);String[] tokens = expression.split(" ");    //返回空格分隔数组for (String token : tokens) {   //遍历数组switch (token) {case "+":case "-":   //符号为+-while (!operatorStack.isEmpty() &&(operatorStack.peek() == '+' || operatorStack.peek() == '-' ||operatorStack.peek() == '*' || operatorStack.peek() == '/'))processAnOperator(operandStack, operatorStack);operatorStack.push(token.charAt(0)); break;case "*":case "/":   //符号为*/while (!operatorStack.isEmpty() &&(operatorStack.peek() == '*' ||operatorStack.peek() == '/'))processAnOperator(operandStack, operatorStack);operatorStack.push(token.charAt(0)); break;case "(": operatorStack.push('('); break;case ")":   //括号while (operatorStack.peek() != '(')processAnOperator(operandStack, operatorStack);operatorStack.pop(); break;default: operandStack.push(Double.parseDouble(token));}}while (!operatorStack.isEmpty())    //处理剩余的操作符processAnOperator(operandStack, operatorStack);return operandStack.pop();}/** 处理一个操作符 */public static void processAnOperator(Stack<Double> operandStack, Stack<Character> operatorStack) {char op = operatorStack.pop();double op1 = operandStack.pop();double op2 = operandStack.pop();switch (op) {   //比较操作符,执行相应操作并入操作数栈case '+': operandStack.push(op2 + op1); break;case '-': operandStack.push(op2 - op1); break;case '*': operandStack.push(op2 * op1); break;case '/': operandStack.push(op2 / op1); break;default:}}/** 格式化表达式 */public static String formatExpression(String s) {StringBuilder stringBuilder = new StringBuilder();s = s.replaceAll(" ", "");  //去除所有空格for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (c == '(' || c == ')' || c == '+' || c == '*' || c == '/')   //判断()+*/stringBuilder.append(" ").append(c).append(" ");else if (c == '.' || Character.isDigit(c))  //判断.和数字stringBuilder.append(c);else if (c == '-') {    //判断-号if (i == 0) stringBuilder.append(c);    //负号else if (s.charAt(i-1) == '+' || s.charAt(i-1) == '-' ||s.charAt(i-1)== '*' || s.charAt(i-1) == '/' ||s.charAt(i-1) == '(')stringBuilder.append(c);    //负号elsestringBuilder.append(" ").append(c).append(" ");    //减号}}s = stringBuilder.toString().trim().replaceAll(" {2}", " ");return s;}/** 格式化值 */public static String format(double value) {String v = String.valueOf(value);return v.endsWith("0") ? String.valueOf((int)value) : v;}}

JavaFX、计算器相关推荐

  1. javafx 制作 24点游戏 24点计算器 24点算法

    24点我也没想到太好的办法 主要思路如下(以四个数举例): 1.先生成3个符号,数量是4* 4* 4也就是64个不同的符号数组,类似这样[+,-,*] 2.将输入的四个数与64组不同符号对应运算保留可 ...

  2. Java实战之亲戚关系计算器(JavaFX版)(1)——项目简述

    项目简述: 该项目是一个通过JavaFX实现的计算亲戚关系的小程序,该小程序具有通过亲戚关系链计算称呼的功能.将介绍如何如何通过JavaFX来实现该项目的全部过程. 使用软件: IntelliJ ID ...

  3. JavaFX --- BMI计算器

    JavaFX -> BMI计算器 ​ 适合java入门练习 涉及控件.面板.布局简单知识点 简单的按钮事件 简单的为程序添加图标 不仅计算BMI,根据BMI值的大小提出建议 package BM ...

  4. Java实战之亲戚关系计算器(JavaFX版)(6)——实现计算功能

    本节概要:实现亲属关系计算 功能一:实现计算功能 在data文件夹下创建RelationShipData.java文件,其中的内容主要是一个二维数组,即关系链数据. 内容如下: package kin ...

  5. Java实战之亲戚关系计算器(JavaFX版)(2)——功能介绍

    功能一:计算亲属关系称谓 比如说:爸爸的爸爸的爸爸是曾祖父,在上面的文本域中显示关系链,而在下面的文本域中显示称谓,这就是计算亲属关系称谓的功能. 点击"父"按钮,在最上面的文本域 ...

  6. 简易计算器 java_用Java做一个简易计算器,要用到哪些知识?

    分析问题关键词:Java.计算器 深夜无聊,暂且一答. 计算器分两个步骤:计算 + 器 篇一 ·「器」 在编程中,我们可以把「器」理解为「GUI(图形界面)」,Java 语言描绘的图形界面有很多种类, ...

  7. Java实现能完成 加减乘除幂与阶乘 组合运算的计算器

    题目叙述: 有一组小学生要开始学习算术运算,需要使用计算机辅助他们检查计算结果,请帮助小同学设计一个能够完成+.-.*.\.幂运算和阶乘的计算器程序 具体要求: 由于是面向小同学的软件工具,请设计一个 ...

  8. 基于Java实现的一元稀疏多项式计算器

    资源下载地址:https://download.csdn.net/download/sheziqiong/85896976 资源下载地址:https://download.csdn.net/downl ...

  9. 基于Java语言实现一元稀疏多项式计算器【100010608】

    1.实验内容 一元稀疏多项式计算器 使用语言:Java 语言 编译环境:openJDk-1.8 2.问题描述 设计一个简易的一元稀疏多项式计算器. 3.需求分析 经过分析,本系统需完成的主要功能如下: ...

最新文章

  1. python的requests模块功能_python中requests模块的使用方法
  2. 移通好闹钟微信小程序全套源码
  3. 《Dotnet9》系列-Google ProtoBuf在C#中的简单应用
  4. 程序猿学习中华古诗词路径
  5. 下单点餐小程序解决方案
  6. KMSpico 无后门下载
  7. DDD 实战 (3):整体工作框架和全局需求分析
  8. 【回波损耗(dB)和电压驻波比(VSWR)之间的关系】
  9. C++ 打印机状态查询之SNMP协议
  10. 网站死链接检测与完美处理方法
  11. 15个网站失效死链接检查工具
  12. 最详细虚拟机VMware安装CDLinux(12)
  13. MIMO系列之分集与复用
  14. leaflet 加载高德地图
  15. ubuntu服务器pdf文件大小,Ubuntu下的PDF阅读器okular安装使用介绍
  16. 陪你云sdk用户指南
  17. 计算机领域中的CAE,CAE
  18. 【观察】不断打破手机行业创新边界,三个维度解读vivo NEX双屏版
  19. python分层抽样_基于列的sklearn分层抽样
  20. 三相LCL型并网逆变器电流闭环虚拟阻尼控制Simulink仿真

热门文章

  1. 华为路由器BGP联邦综合实验
  2. 乐鑫esp8266学习rtos3.0笔记第3篇: 一篇文章带你搞掂存储技术 NVS 的认识和使用,如何利用NVS保存整型、字符串、数组以及结构体。(附带demo)
  3. 原生javascript实现星级评价功能
  4. 0667-6.2.0-什么是Cloudera虚拟私有集群和SDX
  5. UE4加载Excel表格CSV数据及解决中文乱码问题
  6. 鸿蒙适配机型小米,科技晚报|华为鸿蒙适配机型公布 P50首发/小米10S才是真正至尊版...
  7. 在uniapp中如何使用icon图标
  8. 不去摄影棚,不用PS三步快速证件照换底色最简单方式
  9. PHP hypot,hypot - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
  10. 9.7 方向导数与梯度