算術表達式(中綴表達式)轉換為后綴表達式


將后綴表達式exp轉換為postexp的過程如下:

while(從exp讀取字符ch,ch!='\0')

{

  若ch為數字,將后繼的數字都一次存放到postexp中,並以字符'#'標志數值串的結束;

  若ch為左括號“(”,將此括號進棧到運算符棧op中;

  若ch為右括號“)”,將運算符棧op依次出棧,直到“(”,並將“(”也出棧;

  若ch為運算符,優先級不大於運算符op的棧頂運算符(除棧頂運算符為“(”外)的優先級,則依次出棧並存入到postexp中,然后將ch進棧

}

若中綴表達式exp掃描完畢,將運算符棧op中的所有運算符依次出棧並存放到postexp中,就得到了后綴表達式。

 

完整代碼:

#include <stdio.h>
#define MAXSIZE 50

typedef char elemType;
//運算符棧 
typedef struct{
    elemType data[MAXSIZE];
    int top;
}OP;

OP op;


//中綴表達式轉為后綴表達式 
void trans(char exp[],char postexp[]){
    op.top=-1;
    int i=0,j=0;    
    char ch=exp[i];
    while(ch!='\0'){
        switch(ch){
            case '(':{
                op.top++;
                op.data[op.top] = ch;
                break;
            }
            case ')':{
                while(op.data[op.top]!='('){
                    postexp[j++]=op.data[op.top--];
                }
                op.top--;    //去除 '(' 
                break;
            }
            case '+':
            case '-':{
                while(op.top!=-1&&op.data[op.top]!='('){
                    postexp[j++]=op.data[op.top--];
                }
                op.top++;
                op.data[op.top]=ch;
                
                break;
            }
            case '*':
            case '/':{
                while(op.top!=-1&&(op.data[op.top]=='*'||op.data[op.top]=='/')){
                    postexp[j++]=op.data[op.top];
                    op.top--;
                }
                op.top++;
                op.data[op.top]=ch;
                break;
            }
            case ' ':break;
            default :{
                while(ch>='0'&&ch<='9'){
                    postexp[j++]=ch;
                    i++;
                    ch=exp[i];
                }
                i--;                //不是數字 退后一個,用switch來進行判斷 
                postexp[j++]='#';    //在數字結束后添加'#'以便區分 
            }
        }    
        i++; 
        ch=exp[i];
    }
    while(op.top!=-1){                        //將運算符棧中 
        postexp[j++]=op.data[op.top--];
    }
    postexp[j]='\0';
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM