完美计算器用栈解决运算优先级问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
完美计算器(用栈解决运算优先级问题)
import java.applet.*;
import java.awt.*;
import java.util.*;
public class Calculator extends Applet
{
public void init()
{
setLayout(new BorderLayout());
Panel p1=new Panel();
p1.setBackground(Color.gray);//设置p1的背景色
display=new ExpTextField( " ",30);
p1.add(display);
p1.add(new Button( "清空"));
add( "North ",p1);
Panel p2=new Panel();
p2.setLayout(new GridLayout(3,6));//网格布局
p2.add(new Button( "7 "));
p2.add(new Button( "8 "));
p2.add(new Button( "9 "));
p2.add(new Button( "( "));
p2.add(new Button( ") "));
p2.add(new Button( "= "));
p2.add(new Button( "4 "));
p2.add(new Button( "5 "));
p2.add(new Button( "6 "));
p2.add(new Button( ". "));
p2.add(new Button( "+ "));
p2.add(new Button( "- "));
p2.add(new Button( "1 "));
p2.add(new Button( "2 "));
p2.add(new Button( "3 "));
p2.add(new Button( "0 "));
p2.add(new Button( "* "));
p2.add(new Button( "/ "));
add( "Center ",p2);
}
public boolean action(Event e,Object a)//按钮事件的action方法
{
if(a instanceof String)
{
if(a.equals( "清空"))//清空
{
display.setText( " ");
return true;
}
display.setText(display.getText()+(String)a);
if(a.equals( "= "))//当用户按下=键开始计算
display.setText(EvaluateExpression.calculate(display.getText()));
return true;
}
else
return super.action(e,a);//如果事件没有处理,将事件传输到该类在继承体系中父类去处理}
private ExpTextField display;
}
class ExpTextField extends TextField
{
public ExpTextField(String s,int n)
{
super(s,n);
}
public boolean keyDown(Event e,int key)
{
if(key==61)//=键
{
setText(getText()+ "= ");
setText(EvaluateExpression.calculate(getText()));
return true;
}
else if(key==27)//Esc键
{
setText( " ");
return true;
}
else if((key> =40)&&(key <=57)&&(key!=44)//数字或运算符
||(key==8)||(key==127)//Backspace键或delete键
||(key==Event.LEFT)||(key==Event.RIGHT)//左右键
||(key==Event.HOME)||(key==Event.END))//Home键或End键
return super.keyDown(e,key);
else //忽略其它键
return true;
}
}
class EvaluateExpression //算符优先算法
{
public static String calculate(String exp)
{
char lastoptr= '= ';
char c;
char ch;
double d1;//操作数
double d2;//操作数
String opnd= " ";
String result;
Stack optrstack=new Stack();//运算符栈
Stack opndstack=new Stack();//操作数栈
optrstack.push(new Character( '= '));
try
{
for(int i=0;i <exp.length();i++)
{
c=exp.charAt(i);//输入的字符
if(Character.isDigit(c)||(c== '. '))//操作数
{
opnd=opnd+c;
}
else if((c== '+ ')||(c== '- ')||(c== '* ')||(c== '/ ')||(c== '( ')||(c== ') ')||(c== '= '))//运算符
{