1. 程式人生 > 其它 >中綴表示式轉逆波蘭表示式,計算器也可

中綴表示式轉逆波蘭表示式,計算器也可

package A;

import java.util.ArrayList;
//此程式你可以驗算你的逆波蘭表示式有沒有寫對
//4*5-8+60+8/2=4 5 * 8 - 60 + 8 2 / +
//其實逆波蘭表示式並不難,也是由我們常用的中綴表示式轉換來的,仔細寫一下就知道了
public class JosePhu {
public static void main(String[] args) {
ArrayStack arrayStack = new ArrayStack();
String expression="1+((2+3)*4)-5";
//將表示式放到String數組裡面
ArrayList<String> infixExpressionList=arrayStack.toInfixExpressionList(expression);
System.out.println("中綴表示式="+infixExpressionList);
//換成逆波蘭表示式
ArrayList<String> suffixExpressionList=arrayStack.parseSuffixExpressionList(infixExpressionList);
System.out.println("逆波蘭表示式="+suffixExpressionList);
//計算結果
System.out.println("結果:"+arrayStack.calculate(suffixExpressionList));
}
}

package A;

import java.util.ArrayList;
import java.util.Stack;

public class ArrayStack {
private int ADD=1;
private int SUB=1;
private int MUL=2;
private int DIV=2;
//將suffixExpression分割,然後放入動態陣列
public ArrayList<String> getListString(String suffixExpression){
//將suffixExpression按空格分割成一段一段的陣列,型別是String
//其實這裡分割的很巧妙,不論是10,還是1000,反正都是作為陣列中的一個值,就解決了那種只檢測一位的問題
String[] spilt=suffixExpression.split(" ");
ArrayList<String> list=new ArrayList<>();
//有for的地方必定是迴圈,所以這裡是對spilt進行迴圈,把它給加到list裡面去
for (String ele:spilt){
list.add(ele);
}
return list;
}
//對逆波蘭表示式進行計算
public int calculate(ArrayList<String> ls){
Stack<String> stack=new Stack<>();
for (String item:ls){
//正則表示式,如果item匹配的是多位數,是一個類似於123的數字,那麼直接入棧
//"\\s+"匹配任何空白字元,包括空格、製表符、換頁符等等,等價於[ \f\n\r\t\v]
//你可以這樣:return s.replaceAll("\\s+","");將字串中空白字元去掉
if (item.matches("\\d+")){
stack.push(item);
}else {
//不知你發現沒有,它只設置了一個棧,而且只有數字才入棧
int num2=Integer.parseInt(stack.pop());
int num1=Integer.parseInt(stack.pop());
int res=0;
if (item.equals("+")){
res=num1+num2;
}else if (item.equals("-")){
res=num1-num2;
}else if (item.equals("*")){
res=num1*num2;
}else if (item.equals("/")){
res=num1/num2;
}else {
throw new RuntimeException("運算子有誤");
}
stack.push(""+res);
}
}
return Integer.parseInt(stack.pop());
}
public ArrayList<String> toInfixExpressionList(String s){
ArrayList<String> ls=new ArrayList<>();
int i=0;
String str;
char c;
do {
/*if ((c=s.charAt(i))<48||(c=s.charAt(i))>57){
ls.add(""+c);//原來將char加入到String要加上這個:""+
i++;
}else {
str="";
while (i<s.length()&&(c=s.charAt(i))>=48&&(c=s.charAt(i))<=57){
str=str+c;
i++;
}
ls.add(str);
}*/
c=s.charAt(i);
ls.add(""+c);
i++;
}while (i<s.length());
return ls;
}
//此方法真的牛
public ArrayList<String> parseSuffixExpressionList(ArrayList<String> ls){
Stack<String> s1=new Stack<>();//符號棧
//因為考慮到,此棧只需入棧,而且後面需要從壺底輸出,所以用陣列方便一點
ArrayList<String> s2=new ArrayList<>();//數字棧
for (String item:ls){
if (item.matches("\\d+")){
s2.add(item);
}else if (item.equals("(")){
s1.push(item);
}else if (item.equals(")")){
while (!s1.peek().equals("(")){
s2.add(s1.pop());
}
s1.pop();
}else {
while (s1.size()!=0&&getValue(s1.peek())>=getValue(item)){
s2.add(s1.pop());
}
s1.push(item);
}
}
while (s1.size()!=0){
s2.add(s1.pop());
}
return s2;
}
public int getValue(String operation){
int result=0;
switch (operation){
case "+":
result=ADD;
break;
case "-":
result=SUB;
break;
case "*":
result=MUL;
break;
case "/":
result=DIV;
break;
default:
result=-1;//將")"的值設為-1
break;
}
return result;
}
}