




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Java实现图形界面计算器}elseif(!str.equals("0.0")){
str=str.substring(0,str.length()-1);//去掉最后一个元素
DisplayBox.setText(str);
privatevoidAddOne(Stringvalue){//增加一个字符
Stringstr;
str=DisplayBox.getText();
if(str.equals("0.0")){//第一次输入
DisplayBox.setText(value);
}else{
str=str+value;
DisplayBox.setText(str);
privateStringretureResult(){//对输入的式子进行运算;基本方法:逆波兰法,中缀转后缀
Stringstring=DisplayBox.getText();
String[]Midfix=breakDown(string);//中缀表达式的数组
String[]suffix=Conversion(Midfix);//得到后缀表达式
Stringresult=Calculation(suffix);//计算后缀表达式结果
returnresult;
privateStringCalculation(String[]suffix){
StackStringstack=newStack();
Stringsymbols="+-*/";//转换为后缀表达式的式子只会有+-*/符号不会有()
for(inti=0;isuffix.length;i++){
if(suffix[i]==null){//suffix后面可能出现null故对其筛选不进行下列的操作
continue;
if(symbols.indexOf(suffix[i])=0){//为符号时进行运算
doubletop1;
doubletop2;
doubletop;
switch(suffix[i]){
case"+":
top1=Double.parseDouble(stack.pop());//取栈顶将其转化为double
top2=Double.parseDouble(stack.pop());
top=top2+top1;
stack.push(String.valueOf(top));//将top转化为String入栈
break;
case"-":
top1=Double.parseDouble(stack.pop());
top2=Double.parseDouble(stack.pop());
top=top2-top1;
stack.push(String.valueOf(top));
break;
case"*":
top1=Double.parseDouble(stack.pop());
top2=Double.parseDouble(stack.pop());
top=top2*top1;
stack.push(String.valueOf(top));
break;
case"/":
top1=Double.parseDouble(stack.pop());
top2=Double.parseDouble(stack.pop());
if(top1==0){
return"运算过程中除数出现0";
top=top2/top1;
stack.push(String.valueOf(top));
break;
}else{//为数字直接入栈
stack.push(suffix[i]);
Stringresult=stack.pop();
returnresult;
privateString[]breakDown(Stringstring){//将(2+3.14)+9分解成(2+3.14)+9便于后续计算
String[]split=string.split("");
StringDigitString="0123456789.";
StringafterSplit="";
for(inti=0;isplit.length;i++){//将2+3.14变成2,+,3.14便于拆分
if(DigitString.indexOf(split[i])=0){
afterSplit=afterSplit+split[i];
}elseif(afterSplit.equals("")DigitString.indexOf(split[i])0){//第一个为符号时只在后面加。
afterSplit=afterSplit+split[i]+",";
}else{//为()或=-*/在其两侧加上,
afterSplit=afterSplit+","+split[i]+",";
afterSplit=afterSplit.replace(",,",",");//避免(2+3)+2产生……3,),,+,2
split=afterSplit.split(",");//产生的字符串数组中只会含+-*/()整数和小数
returnsplit;
privateString[]Conversion(String[]strings){//中缀转后缀
String[]suffix=newString[strings.length];//后缀表达式
intn=0;//suffix的下标
StackStringstack=newStack();
Stringfirst="*/";
Stringsymbols="+-*/()";
for(inti=0;istrings.length;i++){
if(symbols.indexOf(strings[i])=0){//为符号时
if(stack.empty()){
stack.push(strings[i]);
}else{//栈不为空
if(first.indexOf(strings[i])=0||strings[i].equals("(")){//为+/(直接入栈
stack.push(strings[i]);
}elseif(strings[i].equals(")")){
Stringtop=stack.peek();
while(!top.equals("(")){
top=stack.pop();
suffix[n]=top;
n++;
top=stack.peek();
stack.pop();//(出栈
}else{//符号为+-
if(first.indexOf(stack.peek())0){//当栈顶不为为*/直接入栈
stack.push(strings[i]);
}else{
while(!stack.empty()first.indexOf(stack.peek())=0)
//栈顶运算符先于当前运算符时,出栈到栈顶运算符低于或栈为空为止
Strings=stack.pop();
suffix[n]=s;
n++;
stack.push(strings[i]);//当前运算符入栈
}else{//为数字直接成为后缀一部分
suffix[n]=strings[i];
n++;
while(!stack.empty()){//清除栈内剩余符号
Strings=stack.pop();
suffix[n]=s;
n++;
returnsuffix;
privatebooleanisTrue(Stringstr){
if(!BracketMatching(str)){//括号匹配
returnfalse;
if(!OperatorIsTrue(str)){//符号格式正确
returnfalse;
returntrue;
privatebooleanOperatorIsTrue(Stringstring){//运算数数量=运算符号数+1
String[]split=breakDown(string);
Stringsymblos="+-*/";
Stringbracket="()";
intNumberOfDigits=0;
intNumberOfSymblos=0;
for(inti=0;isplit.length;i++){
if(symblos.indexOf(split[i])=0){
NumberOfSymblos++;
}elseif(bracket.indexOf(split[i])0){//不是括号不是运算符一定为运算数
NumberOfDigits++;
if(NumberOfDigits!=NumberOfSymblos+1){
returnfalse;
returntrue;
privatebooleanBracketMatching(Stringstring){//判断括号是否匹配,否则报错
char[]split=string.toCharArray();
StackCharacterstack=newStack();
for(inti=0;isplit.length;i++){
if(split[i]=='('){
stack.push(split[i]);
}elseif(!stack.empty()split[i]==')'){
stack.pop();
}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 行政审批改革中的法律分析试题与答案
- 主管护师考试要点试题及答案
- 2025年主管护师考试建议试题及答案
- 行政管理在危机中的应对策略试题及答案
- 经济法概论考试经验与试题及答案
- 如何有效培训新入职药师试题及答案
- 护理职场人际关系处理试题及答案
- 中层管理者的角色认知与定位课件
- 文化自觉的试题及答案
- 前沿研究助力2025年执业药师试题及答案
- 软件转让合同协议书
- 专题08 自然灾害和地理信息技术- 2025年十年高考地理真题分项汇编(学生卷)
- 数学在生活中的奇遇
- 2024年金湖县事业单位招聘真题
- 2024年浙江省仙居县事业单位公开招聘教师岗笔试题带答案
- 五年级数学下试卷及答案
- 2025年高考政治答题模板:选必修123主观题答题语言总结
- 儿童性早熟课件
- 生活垃圾合同终止协议
- 山东能源电力集团招聘笔试题库2025
- 辽宁省沈阳市沈北新区2024-2025学年初三下学期质量调研考试(一模)语文试题含解析
评论
0/150
提交评论