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;
    }
    

      

  • 相关阅读:
    Ubuntu上VNC 配置
    Ubuntu远程桌面xrdp方法
    sudo 免密码
    Ubuntu 12.04 root默认密码? 如何使用root登录?
    DNS 和 IPv6 配置攻略
    计算机专业学习浅谈
    [图像]张正友论文翻译(2)
    [图像]张正友论文翻译(1)
    [图像]用Matlab在图像上画矩形框
    word如何修改尾注
  • 原文地址:https://www.cnblogs.com/CherishU/p/3060886.html
Copyright © 2011-2022 走看看