何大土  

将后缀表达式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';
    
}

 

posted on 2018-07-28 13:55  何大土  阅读(2269)  评论(0编辑  收藏  举报