算术表达式(中缀表达式)转换为后缀表达式

Posted hekuiflye

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算术表达式(中缀表达式)转换为后缀表达式相关的知识,希望对你有一定的参考价值。

将后缀表达式exp转换为postexp的过程如下:

while(从exp读取字符ch,ch!=‘‘)

{

  若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!=){
        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]=;
    
}

 

以上是关于算术表达式(中缀表达式)转换为后缀表达式的主要内容,如果未能解决你的问题,请参考以下文章

中缀表达式转换为后缀表达式(1042)

PTA-7-20 表达式转换(中缀转后缀,带括号,负数,小数转换)

java 中字符串能不能直接转换为数学表达式进行计算,不可以要怎么转换,求具体代码。简单点,最好带括号

7-20 表达式转换

5-20 表达式转换 (25分)

数组模拟实现一个50个字符串的堆栈,使用堆栈,将中缀算术表达式转换成后缀表达式。