使用面向对象的思想编写计算器,实现加、减、乘、除操作。其中包括一个运算抽象类Operation和各个运算的实现。
要求:
(1)使用封装;
(2)使用继承;
(3)使用多态。
(4)实现表达式的加、减、乘、除运算。
计算:“3+(5*6-4)”
实现思路:
1) 创建抽象类 Operation及其子运算类;
2) 利用数据结构堆栈的思想,解析表达式;(选做,如果不能实现可以定义成员变量运算数1(numA)和运算数2(numB))
3)编写测试类TestCalc进行验证。
Operation.java
public abstract class Operation {
private double num1;
private double num2;
public void setNum1(double num1) {
this.num1 = num1;
}
public double getNum1() {
return num1;
}
public void setNum2(double num2) {
this.num2 = num2;
}
public double getNum2() {
return num2;
}
public abstract double work(double num1,double num2);
}
TestCalc.java
import java.util.*;
class Cheng extends Operation{
public double work(double num1,double num2){
return num1*num2;
}
}
class Chu extends Operation{
public double work(double num1,double num2){
return num1/num2;
}
}
class Jia extends Operation{
public double work(double num1,double num2){
return num1+num2;
}
}
class Jian extends Operation{
public double work(double num1,double num2){
return num1-num2;
}
}
public class TestCalc {
public static Map<Character,Integer> map = new HashMap<Character,Integer>();
public static boolean isOperator(char c){
return c == '+' || c == '-' || c == '*' || c == '/' || c == '(' ||c == ')';
}
public static boolean cmp(char c1,char c2){
return map.get(c2) >= map.get(c1);
}
public static void main(String[] args){
map.put('(', 0); //'('优先级置0
map.put(')', 3); //')'优先级置3
map.put('/', 2);
map.put('*', 2); //'*''/'优先级置2
map.put('+', 1);
map.put('-', 1); //'+''-'优先级置1
System.out.println("请输入表达式:");
Scanner scan = new Scanner(System.in);
String formula = scan.nextLine();
scan.close();
Operation opt = new Jia();
Stack<String> suffix = new Stack<String>(); // 后缀表达式栈
Stack<Character> operation = new Stack<Character>(); //操作符栈
Stack<String> result = new Stack<String>(); // 结果栈
operation.push(',');
char[] arr = formula.toCharArray();
int index = 0;
int count = 0;
char topOp, nowOp;
for(int i=0;i<arr.length;i++) {
nowOp = arr[i];
if(isOperator(nowOp)) {
if(count > 0) {
suffix.push(new String(arr,index,count));
}
topOp = operation.peek();
if(nowOp == ')') {
while(operation.peek() != '(') {
suffix.push(String.valueOf(operation.pop()));
}
operation.pop();
}else{
while(nowOp != '(' && topOp != ',' && cmp(nowOp,topOp)) {
suffix.push(String.valueOf(operation.pop()));
topOp = operation.peek();
}
operation.push(nowOp);
}
count = 0;
index = i+1;
}else{
count++;
}
}
if(count>1 || (count==1 && !isOperator(arr[index]))){
suffix.push(new String(arr,index,count));
}
while(operation.peek()!=','){
suffix.push(String.valueOf(operation.pop()));
}
Collections.reverse(suffix);
String num1,num2,answer;
while(!suffix.isEmpty()){
answer = suffix.pop();
if(!isOperator(answer.charAt(0))){
result.push(answer);
}else{
num2 = result.pop();
num1 = result.pop();
String resAns = "";
switch(answer.charAt(0)){
case '+':
opt = new Jia();
break;
case '-':
opt = new Jian();
break;
case '*':
opt = new Cheng();
break;
case '/':
opt = new Chu();
break;
}
resAns = String.valueOf((int)opt.work(Integer.valueOf(num1),Integer.valueOf(num2)));
result.push(resAns);
}
}
System.out.printf("\"%s\" 的结果为 %s",formula,result.pop());
}
}