文字列の計算
1.需要分析
数式の計算を完了し、さまざまな算術記号をサポートできます。
2.全体的な考え方
1. 3つのスタックを設計します。1つは計算の読み取り用、1つは数値の格納用、もう1つは文字の格納用です。
2.計算の考え方は、括弧がある場合は最初に括弧を数え、括弧がない場合は、シンボルの優先度が文字が格納されているスタックの最上位以下の場合、スタックに追加されます。それ以外の場合は計算されます。
3.コードの実装
パッケージcom.instance;
import java.util.ArrayList;
java.util.HashMapをインポートします。
インポートjava.util.List;
インポートjava.util.Random;
java.util.Stackをインポートします。
インポートjava.util.regex.Matcher;
import java.util.regex.Pattern;
パブリッククラスCalculateI { int i = 1; //表示符号的義态staticHashMap <String、Integer> temp = new HashMap <String、Integer>(); publicCalculateI (){ temp.put( "("、0); temp.put( ")"、3); temp.put( "-"、1); temp.put( "+"、1); temp.put( "*"、2); temp.put( "/"、2); }
public String returnCalculate(String formula) {
MyStack myStack = new MyStack();//储存操作字符和数字
MyStack numStack = new MyStack();//操作数字
MyStack charStack = new MyStack();//操作字符
char[] array = formula.toCharArray();
for(int i=formula.length()-1;i>=0;i--){
myStack.push(String.valueOf(array[i]));
}
String temp1 = "";//注意读入数字的时候一定要使用getNext函数
temp1 = myStack.getNext();
if(myStack.isNum(temp1)){
numStack.push(temp1);
temp1 = myStack.getNext();
charStack.push(temp1);
}else{
charStack.push(temp1);
temp1 = myStack.getNext();
numStack.push(temp1);
}
while(!myStack.isEmpty()||!charStack.isEmpty()){
if(myStack.isEmpty()){//读入的栈里面没有数值
while (!charStack.isEmpty()) {
String result = result(numStack.pop(), numStack.pop(), charStack.pop());
numStack.push(result);
}
}
temp1 = myStack.getNext();
if(temp1!=null){
if(myStack.isNum(temp1)){
numStack.push(temp1);
}else if(charStack.isEmpty()){//为了后面如果字符栈为空取出字符会出错。
charStack.push(temp1);
}else if(temp1.equals("(")){
charStack.push(temp1);
}else if(temp1.equals(")")){
while(!charStack.peek().equals("(")){
String result = result(numStack.pop(), numStack.pop(), charStack.pop());
numStack.push(result);
}
charStack.pop();//为了排除(
}else if(temp.get(temp1)>=temp.get(charStack.peek())){
charStack.push(temp1);
}else if(temp.get(temp1)<temp.get(charStack.peek())){
while (temp.get(temp1)<temp.get(charStack.peek())&&!charStack.isEmpty()){
String result = result(numStack.pop(), numStack.pop(), charStack.pop());
numStack.push(result);
}
charStack.push(temp1);
}
}
}
return numStack.pop();
}
static String result(String num,String num2,String charOr){
switch (charOr){
case "+":return Double.toString(Double.parseDouble(num2)+Double.parseDouble(num));//数字栈是后面先加入的数字先输出
case "-":return Double.toString(Double.parseDouble(num2)-Double.parseDouble(num));
case "*":return Double.toString(Double.parseDouble(num2)*Double.parseDouble(num));
case "/":
return Double.toString(Double.parseDouble(num2)/Double.parseDouble(num));
}
return null;
}
class MyStack extends Stack<String>{//为了返回一个连串的数字
String getNext(){
if(!this.isEmpty()){
String temp = "";
if(isNum(this.peek())){
while (!(this.isEmpty())&&isNum(this.peek())){//这两个的判断条件一定不能乱,不然当栈为null的时候还会执行peek
temp += this.pop();
}
return temp;
}
return this.pop();//返回的是单个字符
}
return null;
}
boolean isNum(String a){
for(int i=0;i<a.length();i++){
if(!Character.isDigit(a.charAt(i))&&!(a.charAt(i)=='.') ){
return false;
}
}
return true;
}
}
}