📄 calculator.java
字号:
public class Calculator
{
private DoubleStack s=new DoubleStack();
protected String exp;
public Calculator(){}
public boolean getexp(String exp)
{
if(exp.length()==0)
return false;
else
{
this.exp=exp;
return true;
}
}
public int isp(char a)
{
int r=0;
if(a=='#')r=0;
if(a=='(')r=1;
if(a=='^')r=7;
if(a=='*'||a=='/'||a=='%')r=5;
if(a=='+'||a=='-')r=3;
if(a==')')r=8;
return r;
}
public int icp(char a){
int r=0;
if(a=='#')r=0;
if(a=='(')r=8;
if(a=='^')r=6;
if(a=='*'||a=='/'||a=='%')r=4;
if(a=='+'||a=='-')r=2;
if(a==')')r=1;
return r;
}
//将操作数的值进栈
public void AddOperand(double value)
{
s.Push(value);
}
//从栈中取两个操作数
public double GetROperands()
{
if(s.IsEmpty()) //检查栈是否为空
{
System.out.println("it missing operand!"); //栈空,操作数不存在
return -1;
}
return s.Pop(); //取右操作数
}
public double GetLOperands()
{
if(s.IsEmpty()){
System.out.println("missing operand!"); //检查栈是否为空
return -1;
}
//取左操作数
return s.Pop();
}
public void Clear(){
s.MakeEmpty();
}
public void DoOperator(char op){
double left=0.0,right=0.0;
right=GetROperands();
left=GetLOperands();
if(true)
switch(op)
{
case '+':s.Push(left+right);break;
case '-':s.Push(left-right);break;
case '*':s.Push(left*right);break;
case '/':if(right==0.0)
{
System.out.println("divide by 0!");
Clear();
}
else s.Push(left/right);break;
}
else Clear();
}
public double Run(){
CharStack ss=new CharStack();
CharStack s1=new CharStack();
CharStack s2=new CharStack();
char ch,y;
ss.MakeEmpty();
s1.MakeEmpty();
s2.MakeEmpty();
ss.Push('#');
s1.Push('#');
int i=0;
do{
ch=exp.charAt(i);
if(ch=='J'||ch=='Q'||ch=='K'){
s1.Push(ch);
}
if(ch>='0'&&ch<='9')s1.Push(ch);
else if(ch==')')
for(y=ss.Pop();y!='(';y=ss.Pop())
s1.Push(y);
else
{
for (y=ss.Pop();isp(y)>icp(ch);y=ss.Pop()){
s1.Push(y);
}
ss.Push(y);ss.Push(ch);
}
i++;
}while (i<exp.length());
while(!ss.IsEmpty()){
y=ss.Pop();s1.Push(y);
}
s1.Pop();
s1.Push('=');
do {
y=s1.Pop();
s2.Push(y);
}while(y!='#');
y=s2.Pop();
ch=s2.Pop();
while (ch!='='){
switch(ch)
{
case'+':case'-':case'*':case'/':case'^':
DoOperator(ch);break;
default:
AddOperand(ch-'0');
break;
}
ch=s2.Pop();
}
return s.Pop();
}
public static void main(String[] args)
{
Calculator c=new Calculator();
c.Run();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -