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

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

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

  

转载于:https://www.cnblogs.com/CherishU/archive/2013/05/05/3060886.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值