(十三)解析算術表達式

棧:先進後出

中綴表達式:A+B*C

後綴表達式:ABC*+

1.中綴表達式轉後綴表達式


StackX.java(構造一個棧)


package JavaAppInFix;
/**
 * 構造一個棧
 * @author qingshuang
 *
 */
public class StackX {
   private char[] stackArray;
   private int maxSize;
   private int top;
   public StackX(int s){
	   maxSize=s;
	   stackArray=new char[maxSize];
	   top=-1;
   }
   //添加數據
   public void push(char j){
	   stackArray[++top]=j;
   }
   //查看並刪除數據
   public char pop(){
	   return stackArray[top--];
   }
   //查看數據
   public char peek(){
	   return stackArray[top];
   }
   public boolean isEmpty(){
	   return top==-1;
	   
   }
   public int size(){
	   return top+1;
   }
   public char peekN(int n){
	   return stackArray[n];
   }
   public void dispalyStack(String s){
	   System.out.print(s);
	   System.out.print("Stack (bottom-->top):");
	   for(int j=0;j<size();j++){
		   System.out.print(peekN(j)+" ");
	   }
	   System.out.println();
   }
}

InToPost.java(中綴表達式轉成後綴表達式)


package JavaAppInFix;

/**
 * 中綴表達式轉成後綴表達式
 * 
 * @author qingshuang
 * 
 */
public class InToPost {
	private StackX theStack;
	private String input;// 中綴表達式
	private String output="";// 後綴表達式

	public InToPost(String in) {
		input = in;
		int stackSize = input.length();
		theStack = new StackX(stackSize);
	}
//4+3*(6-2)
	public String doTrans() {
		for (int j = 0; j < input.length(); j++) {
			char ch = input.charAt(j);
			theStack.dispalyStack("For " + ch + " ");
			switch (ch) {
			case '+':
			case '-':
				gotOper(ch, 1);
				break;
			case '*':
			case '/':
				gotOper(ch, 2);
				break;
			case '(':
				theStack.push(ch);
				break;
			case ')':
				gotParen(ch);
				break;
			default:
				output = output + ch;
				break;

			}
		}// for循環結束
		while (!theStack.isEmpty()) {
			theStack.dispalyStack("while");
			output = output + theStack.pop();
		}
		theStack.dispalyStack("End");
		return output;
	}

	public void gotOper(char opThis, int perc1) {
       while(!theStack.isEmpty()){
    	   char opTop=theStack.pop();
    	   if(opTop=='('){
    		   theStack.push(opTop);
    		   break;
    	   }else{
    		   int prec2;
    		   if(opTop=='+'||opTop=='-')prec2=1;
    		   else prec2=2;
    		   if(prec2<perc1){
    			   theStack.push(opTop);
    			   break;
    		   }else{output=output+opTop;}
    	   }
       }
       theStack.push(opThis);
	}

	public void gotParen(char ch) {
       while(!theStack.isEmpty()){
    	   char chx=theStack.pop();
    	   if(chx=='('){
    		   break;
    	   }else{
    		   output=output+chx;
    	   }
       }
	}

}

InfixApp.java(中綴表達式轉後綴表達式測試)


package JavaAppInFix;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class InfixApp {

	/**中綴表達式轉後綴表達式測試
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
         String input,output;
         while(true){
        	 System.out.print("Enter infix:");
        	 System.out.flush();
        	 input=getString();
        	 if(input.equals(""))break;
        	 InToPost theTrans=new InToPost(input);
        	 output=theTrans.doTrans();
        	 System.out.println("Postfix is "+output+"\n");
         }
         
	}
	public static String getString() throws IOException{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		String s=br.readLine();
		return s;
	}

}

2.中綴表達式轉後綴表達式後可運算


StackY.java(構造一個棧)


package JavaAppInFix;
/**
 * 中綴表達式轉後綴表達式後可運算
 * @author qingshuang
 *
 */
public class StackY {
   private int[] stackArray;
   private int maxSize;
   private int top;
   public StackY(int s){
	   maxSize=s;
	   stackArray=new int[maxSize];
	   top=-1;
   }
   //添加數據
   public void push(int j){
	   stackArray[++top]=j;
   }
   //查看並刪除數據
   public int pop(){
	   return stackArray[top--];
   }
   //查看數據
   public int peek(){
	   return stackArray[top];
   }
   public boolean isEmpty(){
	   return top==-1;
   }
   public boolean isFull(){
	   return top==maxSize-1;
   }
   public int size(){
	   return top+1;
   }
   public int peekN(int n){
	   return stackArray[n];
   }
   public void dispalyStack(String s){
	   System.out.print(s);
	   System.out.print("Stack (bottom-->top):");
	   for(int j=0;j<size();j++){
		   System.out.print(peekN(j)+" ");
	   }
	   System.out.println();
   }
}

ParsePost.java(運算後的後綴表達式)


package JavaAppInFix;
/**
 * 運算後綴表達式
 * @author qingshuang
 *
 */
public class ParsePost {
    private StackY theStack;
    private String input;
    public ParsePost(String s){
    	input=s;
    }
    public int doParse(){
    	theStack=new StackY(20);
    	char ch;
    	int j;
    	int num1,num2,interAns;//num1,num2取出來的兩操作數,interAns這兩數的運算結果
    	for(j=0;j<input.length();j++){
    		ch=input.charAt(j);
    		theStack.dispalyStack(" "+ch+" ");
    		if(ch>='0'&&ch<='9'){
    			theStack.push((int)(ch-'0'));
    		}else{
    			num2=theStack.pop();
    			num1=theStack.pop();
    			switch(ch){
    			case'+':
    				interAns=num1+num2;
    				break;
    			case'-':
    				interAns=num1-num2;
    				break;
    			case'*':
    				interAns=num1*num2;
    				break;
    			case'/':
    				interAns=num1/num2;
    				break;
    				default:
    					interAns=0;
    			}
    			theStack.push(interAns);
    		}
    	}
    	interAns=theStack.pop();
    	return interAns;
    }
}

PostfixApp.java(運算後綴表達式測試類)


package JavaAppInFix;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 運算後綴表達式
 * @author qingshuang
 *
 */
public class PostfixApp {

	
	public static void main(String[] args) throws IOException {
         String input;
         int output;
         InToPost inobj;
         while(true){
        	 System.out.print("Enter infix:");
        	 System.out.flush();
        	 input=getString();
        	 if(input.equals(""))break;
        	 inobj=new InToPost(input);
              input=inobj.doTrans();//中綴表達式變後綴表達式
              System.out.println("後綴表達式 to  "+input);
              ParsePost theTrans=new ParsePost(input);
              output=theTrans.doParse();
              System.out.println("Evaluates to  "+output);
         }
	}
	public static String getString() throws IOException{
		InputStreamReader isr=new InputStreamReader(System.in);
		BufferedReader br=new BufferedReader(isr);
		String s=br.readLine();
		return s;
	}

}


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