括号匹配与表达式求值问题

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

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

  

posted @ 2013-05-05 14:48  CherishU  阅读(485)  评论(0编辑  收藏  举报