package algortest;
/*
* 思路1:定義一個char型變量以單個字符爲單位從鍵盤接受一個字符,然而java只能從鍵盤接受String
* 型的字符串,此方法實行起來較爲困難
*
* 思路2:定義一個String型變量,先從鍵盤把要計算的表達式全部接收(比如:123*(8-9))
* 然後再逐一的掃描改表達式字符串,該方法可行!
*
*/
import java.util.Scanner;
import java.util.Stack;
public class Biaodashi {
//private static String str="";
public static char compare(char i,char j){
if((i=='#'&&j!='#')||(i=='('&&j!=')')||(j=='('&&i!=')'))return '<';
else if((i=='+'||i=='-')&&(j=='*')||j=='/')return '<';
else if((i=='('&&j==')')||(i=='#'&&j=='#'))return '=';
else return '>';
}
public static int oper(int a,char b,int c){
switch(b){
case '+':
return a+c;//是a+c!不是a+b!!!
case '-':
return a-c;
case '*':
return a*c;
case '/':
return a/c;
default:return 0;
}
//return 0;
}
@SuppressWarnings("unchecked")
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String str=sc.nextLine();//接收整個表達式字符串
str+="##";//防止越界多加了一個‘#’
Stack optr=new Stack();
Stack num=new Stack();
optr.push('#');//符號入棧!!&&str.charAt(t)!='#'
//char ch=sc.nextLine().charAt(0);
int t=0;//出現棧爲空,數組越界等看循環條件是否正確!
while((t<str.length()-1&&str.charAt(t)!='#')||(char)optr.peek()!='#'){
if('0'<=str.charAt(t)&&str.charAt(t)<='9'){
String numb="";
while('0'<=str.charAt(t)&&str.charAt(t)<='9')
numb+=str.charAt(t++);
num.push(Integer.parseInt(numb));//數字入棧
}
else
switch(compare((char)optr.peek(),str.charAt(t))){
case '<':
char ch=str.charAt(t);
optr.push(ch);//符號入棧
t++;
break;
case '>':
char oper=(char)optr.pop();
//if(!num.empty()){
int b=(int) num.pop(),a=(int) num.pop();//數字連續出棧
int c=oper(a,oper,b);
num.push(c);
//t++;
//}
break;
case '=':
optr.pop();
t++;
break;
}
}
System.out.println(num.peek());
}
}
}
藍橋杯 算法訓練 表達式計算 Java
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.