「已注销」 2016-10-07 13:01 采纳率: 0%
浏览 880

中缀转前缀问题,逻辑上没错

思想:
遵循以下步骤:
(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
(2) 从右至左扫描中缀表达式;
(3) 遇到操作数时,将其压入S2;
(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
(4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;
(4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1;
(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
(5) 遇到括号时:
(5-1) 如果是右括号“)”,则直接压入S1;
(5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃;
(6) 重复步骤(2)至(5),直到表达式的最左边;
(7) 将S1中剩余的运算符依次弹出并压入S2;
(8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。

我的代码:

 #include <stdio.h>
#include <string.h>
#include <malloc.h>

char infix[20] = "(A+B)*C";
int top = -1;
char prefix[20];
char opstack[20];

char pop()
{
    return (opstack[top--]);

}

void push(char symbol)
{
    opstack[top] = symbol;
}

int isopr(char s)
{
    if(s == '+' ||  s == '-' ||  s == '*' ||  s == '/' )
    {
        return 1;
    }else return 0;
}

int prcd(char s)
{
    switch(s)
    {
        case '+':return 1;break;
        case '-':return 1;break;
        case '*':return 2;break;
        case '/':return 2;break;
        case '=':return 0;break;
    }
}

void intopre()
{
    char sym;
    int j = 0;
    opstack[++top] = '=';
    for(int i=strlen(infix)-1; i>=0 ; i--)
    {
        sym = infix[i];
        if(isopr(sym) == 0)      //遇到操作数直接压入prefix 
        {
            prefix[j] = sym;
            j++;
        }else     //else1                      
        {
            if(sym == ')')          //遇到右括号,将其压栈 
            {
                push(sym);
            }else if(sym == '(')      //遇到左括号, 则依次弹出stack栈顶的运算符,并压入prefix,直到遇到右括号为止
            {
                while(opstack[top] != ')')
                {
                    prefix[j] = pop();
                    j++;
                }
                pop();
            }else if(prcd(sym) >= prcd(opstack[top]))    //遇到运算符,优先级大于栈顶运算符,将其压栈 
            {
                push(sym);
            }else                                     //遇到运算符,优先级小于栈顶运算符 
            {
                while( prcd(sym) < prcd(opstack[top]) )
                {
                    prefix[j] = pop();
                    j++;    
                }                
            }
        }//else1结束 
    }//for循环结束 
}

int main(void)
{
    intopre();
    printf("%s",prefix);
    return 0;
}

不知道哪里出错,最后解总是出错

应该得到

*+ABC

却得到
C)B*A(

  • 写回答

1条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!