1. 程式人生 > >用Java實現輸入算數式計算值 ---中綴表示式轉換為字尾表示式

用Java實現輸入算數式計算值 ---中綴表示式轉換為字尾表示式

import java.util.Scanner; /*文字計算器,支援加減乘除、括號。*/ //1+2*(4-3)/2 (10+20)*3/5-6 10+2*(40-3)/2 public class Calculate { public static String[] stack= new String[100];//定義棧 public static int top=0; public static void push(String a) {//入棧操作 if(top>=100) return; stack[top++]=a; } public static
String pop() {//出棧操作 if(top==0) return null; return stack[--top]; } public static boolean isEmpty() {//判斷棧是否為空 if(top==0) return true; return false; } public static String getTop() {//獲取棧頂元素 if(top<100) return stack[top-1]; return null
; } public static void zl1(String[] s1,String[] s2) {//s2是字尾表示式 int j=0; for(int i=0;i<s1.length;i++)//遍歷字串 { if(s1[i].equals("")) break; else if(isEmpty()&&(s1[i].equals("+")||s1[i].equals("-")||s1[i].equals("*")||s1[i].equals("/"))) { push(s1[i]); } else
if(!s1[i].equals("+")&&!s1[i].equals("-")&&!s1[i].equals("*")&&!s1[i].equals("/")&&!s1[i].equals("(")&&!s1[i].equals(")")) { s2[j++]=s1[i]; } else if(s1[i].equals("(")) push(s1[i]); else if(s1[i].equals(")")) { String q=pop(); while(!isEmpty()&&!q.equals("(")) { s2[j++]=q; q=pop(); } } else if(s1[i].equals("+")||s1[i].equals("-")) { while(!isEmpty()&&(!getTop().equals("(")&&!getTop().equals(")"))) s2[j++]=pop(); push(s1[i]); } else if(s1[i].equals("*")||s1[i].equals("/")) { while(!isEmpty()&&(!getTop().equals("+")&&!getTop().equals("-")&&!getTop().equals("(")&&!getTop().equals(")"))) s2[j++]=pop(); push(s1[i]); } } while(!isEmpty()) s2[j++]=pop(); } //計算方法 public static double calculate(String[] s2) { double[] stack1= new double[100];//存放計算結果的棧 int top1=0; for(int i=0;s2[i]!=null;i++) { if(!s2[i].equals("+")&&!s2[i].equals("-")&&!s2[i].equals("*")&&!s2[i].equals("/")) { stack1[top1++]= Double.parseDouble(s2[i]); } if(s2[i].equals("+")||s2[i].equals("-")||s2[i].equals("*")||s2[i].equals("/")) { if(s2[i].equals("+")) { stack1[top1-2]=stack1[top1-2]+stack1[top1-1]; top1--; } if(s2[i].equals("-")) { stack1[top1-2]=stack1[top1-2]-stack1[top1-1]; top1--; } if(s2[i].equals("*")) { stack1[top1-2]=stack1[top1-2]*stack1[top1-1]; top1--; } if(s2[i].equals("/")) { stack1[top1-2]=stack1[top1-2]/stack1[top1-1]; top1--; } } } return stack1[0]; } public static void zl(String[] s) {//對輸入的字串進行處理 for(int i=0;i<(s.length-1);i++) { if(!s[i].equals("+")&&!s[i].equals("-")&&!s[i].equals("*")&&!s[i].equals("/")&&!s[i].equals("(")&&!s[i].equals(")")) { if(!s[i+1].equals("+")&&!s[i+1].equals("-")&&!s[i+1].equals("*")&&!s[i+1].equals("/")&&!s[i+1].equals("(")&&!s[i+1].equals(")")) { s[i]=s[i]+s[i+1]; for(int j=i+1;j<(s.length-1);j++) s[j]=s[j+1]; s[s.length-1]=""; } } } } public static boolean panduan(String s) {//對錶達式進行錯誤判斷 String w=s; int flag=0; for(int i=0;i<s.length();i++) { if(w.charAt(i)=='('||w.charAt(i)==')') flag++; } if(flag%2!=0) { System.out.println("括號匹配錯誤!"); return false; } for(int i=0;i<s.length();i++) { if(w.charAt(i)=='+'||w.charAt(i)=='-'||w.charAt(i)=='*'||w.charAt(i)=='/') { if(w.charAt(i+1)=='+'||w.charAt(i+1)=='-'||w.charAt(i+1)=='*'||w.charAt(i+1)=='/'||w.charAt(i+1)==')') { System.out.println("運算子錯誤!"); return false; } } if(w.charAt(i)=='(') { if(w.charAt(i+1)=='+'||w.charAt(i+1)=='-'||w.charAt(i+1)=='*'||w.charAt(i+1)=='/'||w.charAt(i+1)=='/') { System.out.println("運算子錯誤!"); return false; } } } String[] q=s.split("[0-9+-/*()]*"); for(String a:q) { if(!a.equals("")) { System.out.println("算式中有特殊字元(不屬於運算子或數字)!"); return false; } } return true; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("輸入正確的算數式:"); String s= sc.nextLine(); s=s.trim(); if(panduan(s)) { String[] s1=s.split(""); zl(s1); String[] s2= new String[s1.length]; zl1(s1,s2); System.out.println("結果是:"+calculate(s2)); } } }