用Java實現輸入算數式計算值 ---中綴表示式轉換為字尾表示式
阿新 • • 發佈:2019-01-04
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));
}
}
}