藍橋杯 算法訓練 表達式計算 Java


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());
  }
 }
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章