zoukankan      html  css  js  c++  java
  • 括号匹配与表达式求值问题

    运算符定义优先级:#   (   +   -   *   /   

                             -1   0   1   1   2   2 

    从原表达式求后缀式的规则为:

    1.新建运算符栈,栈底元素为"#"(作为运算符栈的结束符号),从第一个位置起扫描表达式

    2.若当前字符是操作数,则直接发送给后缀表达式,扫描位置加1;

    3.若当前字符为运算符且优先级大于栈顶运算符,则进栈,扫描位置加1。

    4.若当前字符为运算符且优先级不大于(小于等于)栈顶运算符,则退出栈顶运算符并将其发送给后缀式,并将将当前运算符放入栈中,扫描位置不变。

    5.若当前字符为"(",直接进栈,扫描位置加1。

    6.若当前字符为")",则从栈顶起,依次将栈中"("之前的运算符出栈并发送给后缀式,并将栈中"("出栈,扫描位置加1。

    7.若当前字符是结束符,则将栈中的全部运算符依次发送给后缀式(不包括运算符的结束符号)。

    代码如下:

    char *RPExpression(char *e)
    /* 返回表达式e的逆波兰式 */
    {
        Stack s;
        InitStack(s);
        Push(s,'#');
        char c;
        char *t;    
        t=(char*)malloc(strlen(e)*sizeof(char));
        int i,j=0;
        for(i=0;e[i]!='\0';i++)
        {
            if((e[i]!='+')&&(e[i]!='-')&&(e[i]!='*')&&(e[i]!='/')&&(e[i]!='(')&&(e[i]!=')'))
            {
                t[j]=e[i];
                j++;
                continue;
            }
            switch(e[i])
            {    
                case '+':
                case '-':
                {
                    c=Top(s);
                    if(c=='('||c=='#')
                    {
                        Push(s,e[i]); 
                        break;                   
                    }
                    else
                    {
                        Pop(s,c);
                        t[j]=c;
                        j++;
                        i--;
                        break;                    
                    }
                }
                case '*':
                case '/':
                {
                    c=Top(s);
                    if(c=='*'||c=='/')
                    {
                        Pop(s,c);
                        t[j]=c;
                        j++;
                        i--;
                        break; 
                    }
                    else
                    {
                        Push(s,e[i]);
                        break;
                    }
                }
                case '(':
                {
                    Push(s,e[i]);
                    break;
                }
                case ')':
                {
                    while(Top(s)!='(')
                    {
                        Pop(s,c);
                        t[j]=c;
                        j++;                    
                    }
                    Pop(s,c);
                    break;
                }
            }    
        }
        while(Top(s)!='#')
        {
            Pop(s,c);
            t[j]=c;
            j++;
        }
        t[j]='\0';
        return t;
    }
    

      

  • 相关阅读:
    Spring整合MyBatis(一)MyBatis独立使用
    Spring AOP源码分析(三)创建AOP代理
    Spring AOP源码分析(二)动态A0P自定义标签
    Spring AOP源码分析(一)使用示例
    JDK(十)JDK1.7&1.8源码对比分析【集合】ConcurrentHashMap
    JDK(九)JDK1.7源码分析【集合】HashMap的死循环
    JDK(八)JDK1.7&1.8源码对比分析【集合】HashMap
    MySQL(五)SELECT语句执行顺序
    版本控制器:SVN
    springmvc
  • 原文地址:https://www.cnblogs.com/CherishU/p/3060886.html
Copyright © 2011-2022 走看看