资源简介
/**
* Java计算器
* chishaxie
* 支持中缀表达式运算(可以算一个很长的数学表达式)
* 支持高精度浮点数运算
* 支持按钮和键盘同步监听
* 支持错误处理并提示
*/
可以试试算65535的阶乘啰(等待1分钟左右)
代码片段和文件信息
/**
* Java计算器
* chishaxie
* 支持中缀表达式运算
* 支持高精度浮点数运算
* 支持按钮和键盘同步监听
* 支持错误处理并提示
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.util.Stack;
import java.util.StringTokenizer;
import javax.swing.JButton;
import javax.swing.Jframe;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.LineBorder;
/**
* 计算器引擎类(抽象类)
* 提供中缀表达式的计算功能
* 支持高精度浮点数
* 运算过程出现循环小数只处理至其小数点后15位
* @author chishaxie
* @throws Exception 计算过程中出现错误
*/
abstract class CalculatorEngine {
/**
* 运算符优先级判断
* @param op 运算符或者‘(’或者‘=’
* @return 优先级(最高4,最低0)
*/
static private int Precedence(char op)
{
switch (op) {
case ‘+‘:
case ‘-‘:
return 1; // 定义加减运算的优先级为1
case ‘*‘:
case ‘/‘:
case ‘%‘:
return 2; // 定义乘除与取余运算的优先级为2
case ‘^‘:
return 3; // 定义次方运算的优先级为3
case ‘!‘:
return 4; // 定义阶乘运算的优先级为4
case ‘(‘:
case ‘=‘:
default:
return 0; // 定义在栈中的左括号和栈底字符的优先级为0
}
}
/**
* 中缀表达式转换后缀表达式
* @param str 中缀表达式字符串(要求以=结尾)
* @return 后缀表达式的字符串形式
* @throws Exception 中缀表达式存在错误
*/
static private String toSuffix(String str) throws Exception {
StringBuffer strBuf = new StringBuffer();// 存储后缀表达式
Stack stack = new Stack();// 字符栈,用于处理运算符
stack.push(‘=‘);// 压入栈底字符
int i = 0;// 中缀式字符串迭代器
if(str==null || str.equals(““) || str.equals(“=“))
throw new Exception(“中缀式不能为空“);
char ch = str.charAt(i);// 临时字符处理
if(ch==‘.‘)
throw new Exception(“中缀式格式不规范(不能以“.”开头)“);
if (str.charAt(str.length() - 1) != ‘=‘)
throw new Exception(“中缀式格式不规范(不以“=”结尾)“);
if(ch==‘-‘ || ch==‘+‘)
strBuf.append(“0 “);//正负号首位补零
while (ch != ‘=‘) {
if (ch == ‘ ‘)
ch = str.charAt(++i);// 读取下一个字符(忽略空格)
else if (ch == ‘(‘) {
stack.push(‘(‘);// 如果是左括号将其压入栈
ch = str.charAt(++i);
if(ch==‘-‘ || ch==‘+‘)
strBuf.append(“0 “);//正负号补零
} else if (ch == ‘)‘) {
while (stack.peek() != ‘(‘) {
if (stack.peek() == ‘=‘)
throw new Exception(“括号不匹配缺少“(”“);
strBuf.append(stack.pop());
}
stack.pop();
ch = str.charAt(++i);
} else if (ch == ‘+‘ || ch == ‘-‘ || ch == ‘*‘ || ch == ‘/‘ || ch==‘^‘ || ch==‘!‘ || ch==‘%‘) {
char w = stack.peek();// 临时读取栈中的运算符
// 将现在的运算符和栈中的运算符进行优先级比较
while (Precedence(w) >= Precedence(ch)) {
strBuf.append(w);
stack.pop();
w = stack.peek();
}
stack.push(ch);
ch = str.charAt(++i);
} else {
// 直接将数字和小数点加到后缀式中
if (!((ch >= ‘0‘ && ch <= ‘9‘) || ch == ‘.‘))
throw new Exception(“出现非法符号“);
- 上一篇:android 自定义 模仿Launcher
- 下一篇:手机号码归属地
相关资源
- 满天星星java源程序
- Java面向对象程序设计(源代码)
- JAVA WindowBuilder 制作的简易粗暴的计算
- 农行Java笔试题
- 康博嘉信息科技有限公司Java笔试题
- java笔试题大集合及答案另附各大公司
- Bezier曲线代码 java
- JAVA链表实现类数据结构学习
- javaSwing万年历小程序
- iOS日志框CocoaLumberjack 使用demo,包含
- java编程思想(第四版)书中源码及习
- LZW实现Java压缩解压
- java实现数据的备份与恢复jar包
- java3D显示一个球的代码
- 利用Java3D1.4制成的动态爬山算法
- Activiti7视频教程Java通用型工作流开发
- 基于Java的课堂随机点名器
- 基于Java的课堂_随机点名器
- 使用java实现的Bezier曲线
- java + sql 银行管理系统
- QR分解的Java实现
- ISM解释结构模型算法的JAVA
- Java+ajax写的登录
- Java多人聊天室(有登录注册)
- 根据配置文件自动构造Bean类
- 基于java-web的图书管理系统带源码
- 大文件上传的javawebuploader包括前台和
- Java-保存计算过程的计算器
- SpringBoot集成Elasticsearch已实现各种ES操
- java 抽奖系统jar 完整版
评论
共有 条评论