Java实现一个简易的计算器
用到的部分API:
-
Double.parseDouble(String a);
将字符串a转化成对应的Double类型并返回,但字符串a中不能包含除数字与小数点以外的字符
例:
Double d = Double.parseDouble(“12.34”);
如上做以后,变量d的值为12.34 -
String.charAt(int a);
取字符串中索引a处的char值并返回
例:
String st = “abcde”;
char ch1 = st.charAt(2);
如上做以后,变量ch1的值为’c’ -
String.substring(a,b);
截取字符串由索引a到索引b之间的一段作为一个新的字符串并返回(包括a但不包括b)
例:
String st1 = “abcde”;
String st2 = sr1.substring(1,3);
如上做以后,字符串st2的值为"bc"
算法思想
算法思想参照以前的一个c语言实现计算器的博客:c语言实现一个简易的计算器
演示代码
import java.util.Scanner;
public class Work3 {
public static void main(String []args)
{
//i是循环变量兼字符串的读取索引,j是数字首位桩点索引
int i=0,j=0;
double k=0,l=0; //出栈数字暂存
Stack stack1=new Stack('D',20); //数字存放栈
Stack stack2=new Stack('C',20); //字符存放栈
String st; //算术式储存
char a; //出栈字符暂存
Scanner sc = new Scanner(System.in);
System.out.println("请输入算术表达式");
st=sc.nextLine();
for(i=0;i<st.length();i++)
{
if(('0'>st.charAt(i)||st.charAt(i)>'9')&&st.charAt(i)!='.')
{
j=i+1;
if(stack2.Counter==0)
{
stack2.Cin(st.charAt(i));
}
else
{
switch(preemption(st.charAt(i),stack2.C[stack2.Counter-1]))
{
case 1:
stack2.Cin(st.charAt(i));
break;
case 2:
i--;
a=stack2.Cout();
k=stack1.Dout();
l=stack1.Dout();
stack1.Din(math(a, l, k));
break;
case 3:
stack2.Cout();
break;
case 4:
System.out.println("读入非法字符");
break;
default:
System.out.println("程序有误");
}
}
}
else
{
if((i+1)==st.length()||(('0'>st.charAt(i+1)||st.charAt(i+1)>'9')&&st.charAt(i+1)!='.'))
{
stack1.Din(Double.parseDouble(st.substring(j, i+1)));
}
}
}
//补算机制
while(stack2.Counter!=0)
{
a=stack2.Cout();
k=stack1.Dout();
l=stack1.Dout();
stack1.Din(math(a, l, k));
}
System.out.println(stack1.Dout());
}
//基础计算函数,使用方法如 1+2--->a=+,b=1,c=2;
static double math(char a,double b,double c)
{
double d=0;
switch(a)
{
case '+':
d=b+c;
break;
case '*':
d=b*c;
break;
case '/':
d=b/c;
break;
case '-':
d=b-c;
break;
}
return d;
}
//优先权比较函数
//a为当前读入符号,b为栈顶符号
//返回指令索引 1.a入栈,2.b出栈运算,3.删除栈顶字符与当前读入字符(用作括号相见),4.错误字符,报错
static int preemption(char a,char b)
{
switch(a)
{
case '+':
if(b=='-'||b=='*'||b=='/') return 2;
else return 1;
case '-':
if(b=='+'||b=='*'||b=='/') return 2;
else return 1;
case '*':
if(b=='/') return 2;
else return 1;
case '/':
if(b=='*') return 2;
else return 1;
case '(':
return 1;
case ')':
if(b=='(') return 3;
else return 2;
default:return 4;
}
}
}
//堆栈类
//构造方法(类型,大小)类型通过D与C来决定是double型还是char型
//入栈方法(入栈数据),分为D型入栈与C型入栈
//出栈方法(),返回出栈数据,分为D型和C型
class Stack
{
static double D[],d;
static char C[],c;
int Counter=0;
public Stack(char type,int size)
{
switch(type)
{
case 'D':
D=new double [size];
break;
case 'C':
C= new char [size];
break;
}
}
public void Cin(char a)
{
C[Counter]=a;
Counter++;
}
public void Din(Double a)
{
D[Counter]=a;
Counter++;
}
public char Cout()
{
Counter--;
c=C[Counter];
return c;
}
public Double Dout()
{
Counter--;
d=D[Counter];
return d;
}
}