Java实现一个简易的计算器

Java实现一个简易的计算器

用到的部分API

  1. Double.parseDouble(String a);
    将字符串a转化成对应的Double类型并返回,但字符串a中不能包含除数字与小数点以外的字符
    例:
    Double d = Double.parseDouble(“12.34”);
    如上做以后,变量d的值为12.34

  2. String.charAt(int a);
    取字符串中索引a处的char值并返回
    例:
    String st = “abcde”;
    char ch1 = st.charAt(2);
    如上做以后,变量ch1的值为’c’

  3. 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;
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值