且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

C语言实现中缀表达式转前缀表达式

更新时间:2023-02-18 11:47:12

代码如下:

#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];
        // MODIFY:  添加  && sym != ')' && sym != '('
        if (isopr(sym) == 0 && sym != ')' && sym != '(')      //遇到操作数直接压入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循环结束

    // MODIFY:  (7) 将S1中剩余的运算符依次弹出并压入S2;
    while (top >= 0) {
        char temp = pop();
        if (temp != '=') {
            prefix[j++] = temp;
        }
    }
}

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

我改了两处:

// MODIFY:  添加  && sym != ')' && sym != '('
if (isopr(sym) == 0 && sym != ')' && sym != '(')      //遇到操作数直接压入prefix

// MODIFY:  (7) 将S1中剩余的运算符依次弹出并压入S2;
while (top >= 0) {
    char temp = pop();
    if (temp != '=') {
        prefix[j++] = temp;
    }
}

注释有 MODIFY 的就是我修改的, 你可以看看哈.