Java实现图形界面计算器_第1页
Java实现图形界面计算器_第2页
Java实现图形界面计算器_第3页
Java实现图形界面计算器_第4页
Java实现图形界面计算器_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论