「已注销」 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条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站