资源简介
/**
* 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源码,servlet+jsp),适
- java串口通信全套完整代码-导入eclip
- jsonarray所必需的6个jar包.rar
- 三角网构TIN生成算法,Java语言实现
- java代码编写将excel数据导入到mysql数据
- Java写的cmm词法分析器源代码及javacc学
- JAVA JSP公司财务管理系统 源代码 论文
- JSP+MYSQL旅行社管理信息系统
- 推荐算法的JAVA实现
- 基于Java的酒店管理系统源码(毕业设
- java-图片识别 图片比较
- android毕业设计
- java23种设计模式+23个实例demo
- java Socket发送/接受报文
- JAVA828436
- java界面美化 提供多套皮肤直接使用
- 在线聊天系统(java代码)
- 基于Java的图书管理系统807185
- java中实现将页面数据导入Excel中
- java 企业销售管理系统
- java做的聊天系统(包括正规课程设计
- Java编写的qq聊天室
- 商店商品管理系统 JAVA写的 有界面
- JAVA开发聊天室程序
- 在linux系统下用java执行系统命令实例
- java期末考试试题两套(答案) 选择(
- JAVA3D编程示例(建模、交互)
- Java 文件加密传输
- java做的房产管理系统
评论
共有 条评论