JAVA 实现高级计算器程序

JAVA 实现高级计算器程序用JAVA编写了一个高级计算器程序,可以实现带括号的四则运算,如同数据结构书上所讲,可以利用栈将中缀表达式转换为后缀表达式,再利用栈计算后缀表达式

用JAVA编写了一个高级计算器程序,可以实现带括号的四则运算,如同数据结构书上所讲,可以利用栈将中缀表达式转换为后缀表达式,再利用栈计算后缀表达式。中缀表达式符合人的思维习惯,但计算机却容易理解后缀表达式。

话不多说,直接上代码:

package indi.list;
import java.util.*;

public class Calculator {
	private static final int MAXCAPACITY = 500;
	private String expression;
	
	public Calculator(String expression) {
		if(expression.length() > MAXCAPACITY)
			System.out.println("字符串长度超出最大值");
		else
			this.expression=expression;
	}
	
	public int getPriority(String str) {
		int pri=-1;
		
		if(str.equals("("))
			pri=0;
		else if(str.equals("+") || str.equals("-"))
			pri=1;
		else if(str.equals("*") || str.equals("/"))
			pri=2;
		
		return pri;		
	}
	
	public String[] split() {
		ArrayList<String> strList=new ArrayList<String>();
		int splitIndex=0;
		
		for(int i=0;i<expression.length();i++) {
			if(expression.charAt(i)=='+' || expression.charAt(i)=='-' || expression.charAt(i)=='*' || expression.charAt(i)=='/' || expression.charAt(i)=='(' || expression.charAt(i)==')'){				
				if(splitIndex == i) { //处理连续多个操作符
					if(expression.charAt(i)=='-') {     //处理操作符"( + - * /"符号后面遇到"-"情况时,将后面的数字当做负数处理
						splitIndex=i;
						continue;
					}
					else
						strList.add(expression.substring(splitIndex, i+1));
				}
				else {
					strList.add(expression.substring(splitIndex, i));
					strList.add(expression.substring(i, i+1));
				}
				splitIndex=i+1;
			}
			if((i==expression.length()-1) && (splitIndex<=i))
				strList.add(expression.substring(splitIndex));
		}
		
		return strList.toArray(new String[0]);
	}
	
	public String[] getSuffixExpression(String[] expression) {
		Stack<String> strStack=new Stack<String>();
		ArrayList<String> strList=new ArrayList<String>();
		
		for(int i=0;i<expression.length;i++) {
			if(expression[i].equals("("))  //遇到'('时入栈
				strStack.push(expression[i]);
			else if(expression[i].equals("+") || expression[i].equals("-") ||expression[i].equals("*") ||expression[i].equals("/")) {
				if(strStack.isEmpty())     //栈空时操作符入栈
					strStack.push(expression[i]);
				else {                     //否则比较栈顶操作符优先级
					while((!strStack.isEmpty()) && (getPriority(strStack.peek())>=getPriority(expression[i]))) {
						strList.add(strStack.pop());
					}
					strStack.push(expression[i]);
				}				
			}
			else if(expression[i].equals(")")) {//遇到')'时出栈直至'('
				while(!strStack.peek().equals("(")){
					strList.add(strStack.pop());
				}
				strStack.pop(); //抛出'('
			}
			else
				strList.add(expression[i]);
		}
		while(!strStack.isEmpty())
			strList.add(strStack.pop());
		
		return strList.toArray(new String[0]);
	}
	
	public double getResult(String[] expression) {
		Stack<Double> strStack=new Stack<Double>();
		double num1,num2;
		double result=0;
		
		for(int i=0;i<expression.length;i++) {
			if(expression[i].equals("+") || expression[i].equals("-") ||expression[i].equals("*") ||expression[i].equals("/")) {
				String str=expression[i];
				switch(str) {
					case "+":{num1=strStack.pop();num2=strStack.pop();result=num2+num1;strStack.push(result);break;}
					case "-":{num1=strStack.pop();num2=strStack.pop();result=num2-num1;strStack.push(result);break;}
					case "*":{num1=strStack.pop();num2=strStack.pop();result=num2*num1;strStack.push(result);break;}
					case "/":{num1=strStack.pop();num2=strStack.pop();result=num2/num1;strStack.push(result);break;}
				}
			}
			else
				strStack.push(Double.valueOf(expression[i]));
		}
		
		result=0;
		while(!strStack.isEmpty()) {
			result+=strStack.pop();
		}
		
		return result;
	}
	
	public double getResult() {
		return getResult(getSuffixExpression(split()));
	}
}

上述代码为一个计算器类,包含了6个方法:

(1)public Calculator(String expression):构造函数

(2)public int getPriority(String str):获得运算符优先级

(3)public String[] split():字符串分割

(4)public String[] getSuffixExpression(String[] expression):获得后缀表达式

(5)public double getResult(String[] expression):获得运算结果

(6)public double getResult():获得运算结果

由于JAVA自带的分割函数实现的功能有限,所以这里自己实现了一个字符串分割函数,返回字符串数组,并且可以识别负数的情景。

主类中测试代码为:

package indi.list;

public class Main {

	public static void main(String[] args) {
		Calculator exp1=new Calculator("-6/(-5.8-3)+0.3*(8-9)/6");
		
		String[] strSplit=exp1.split();
		String[] strSuffixExpression=exp1.getSuffixExpression(strSplit);
		double result=exp1.getResult(strSuffixExpression);
		
		System.out.println("---------原字符串是---------");
		System.out.println("-6/(-5.8-3)+0.3*(8-9)/6");
		System.out.println("-------分割后的字符串是-------");
		for(int i=0;i<strSplit.length;i++)
			System.out.print("["+strSplit[i]+"]"+"\t");
		System.out.println("\n");
		System.out.println("-------后缀形式的字符串是-------");
		for(int i=0;i<strSuffixExpression.length;i++)
			System.out.print("["+strSuffixExpression[i]+"]"+"\t");
		System.out.println("\n");
		System.out.println("---------最后计算结果是---------");
		System.out.println(result);
		System.out.println("-------计算机计算结果是-------");
		result=-6/(-5.8-3)+0.3*(8-9)/6;
		System.out.println(result);
	}

}

输出结果为:

---------原字符串是---------
-6/(-5.8-3)+0.3*(8-9)/6
-------分割后的字符串是-------
[-6]	[/]	[(]	[-5.8]	[-]	[3]	[)]	[+]	[0.3]	[*]	[(]	[8]	[-]	[9]	[)]	[/]	[6]	

-------后缀形式的字符串是-------
[-6]	[-5.8]	[3]	[-]	[/]	[0.3]	[8]	[9]	[-]	[*]	[6]	[/]	[+]	

---------最后计算结果是---------
0.6318181818181817
-------计算机计算结果是-------
0.6318181818181817

 

今天的文章JAVA 实现高级计算器程序分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/62643.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注