码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-07-28 15:09:44      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:括号   def   添加   ||   size   efault   bre   运算符   cas   

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

 

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

标签:括号   def   添加   ||   size   efault   bre   运算符   cas   

原文地址:https://www.cnblogs.com/hekuiFlye/p/9381818.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!