zoukankan      html  css  js  c++  java
  • 算术表达式(中缀表达式)转换为后缀表达式

    将后缀表达式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]='';
        
    }
  • 相关阅读:
    2021/1/10周总结一
    java基础复习五
    java基础复习四
    构建之法读书笔记三
    javaweb学生教务系统
    java基础复习三
    关于eclipse项目错误的一些小经验总结
    Java基础复习二
    JavaDoc文档
    2017-2018-2 20179216 《网络攻防与实践》 第四周总结
  • 原文地址:https://www.cnblogs.com/hekuiFlye/p/9381818.html
Copyright © 2011-2022 走看看