📜  c 中前缀转换器算法的中缀 (1)

📅  最后修改于: 2023-12-03 14:59:39.052000             🧑  作者: Mango

中缀转前缀算法介绍

中缀表达式是我们通常使用的表达式表示方式,例如 2 + 3(3 + 4) * 5 等等。但是,处理这种形式的表达式并不方便,所以我们经常需要将其转换为另外两种表达式形式之一:前缀表达式和后缀表达式。

前缀表达式又称为波兰式,其运算符位于操作数之前。例如,2 + 3 的前缀形式为 + 2 3(3 + 4) * 5 的前缀形式为 * + 3 4 5

在计算机中,我们可以使用栈来实现中缀转前缀的算法。下面是一个用 C 语言实现的中缀转前缀算法的示例代码片段:

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

// 判断字符是否为运算符(+-*/^())
int isOperator(char ch) {
    if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^' || ch == '(' || ch == ')') {
        return 1;
    }
    return 0;
}

// 判断运算符的优先级
int precedence(char ch) {
    if (ch == '^') {
        return 3;
    } else if (ch == '*' || ch == '/') {
        return 2;
    } else if (ch == '+' || ch == '-') {
        return 1;
    } else {
        return 0;
    }
}

// 中缀转前缀函数
void infixToPrefix(char infix[], char prefix[]) {
    int i, j;
    int len = strlen(infix);
    char stack[100];
    int top = -1;

    // 反转中缀表达式
    for (i = len - 1, j = 0; i >= 0; i--, j++) {
        char ch = infix[i];
        if (ch == '(') {
            ch = ')';
        } else if (ch == ')') {
            ch = '(';
        }
        prefix[j] = ch;
    }
    prefix[j] = '\0';

    // 转换为前缀表达式
    for (i = 0, j = 0; i < len; i++) {
        char ch = prefix[i];
        if (!isOperator(ch)) {
            prefix[j] = ch;
            j++;
        } else {
            if (ch == '(') {
                stack[++top] = ch;
            } else if (ch == ')') {
                while (top != -1 && stack[top] != '(') {
                    prefix[j] = stack[top];
                    j++;
                    top--;
                }
                top--;
            } else {
                while (top != -1 && precedence(ch) <= precedence(stack[top])) {
                    prefix[j] = stack[top];
                    j++;
                    top--;
                }
                stack[++top] = ch;
            }
        }
    }

    while (top != -1) {
        prefix[j] = stack[top];
        j++;
        top--;
    }

    prefix[j] = '\0';

    // 反转前缀表达式
    len = strlen(prefix);
    for (i = 0; i < len / 2; i++) {
        char temp = prefix[i];
        prefix[i] = prefix[len - i - 1];
        prefix[len - i - 1] = temp;
    }
}

int main() {
    char infix[100] = "2 + 3";
    char prefix[100];

    infixToPrefix(infix, prefix);

    printf("Infix Expression: %s\n", infix);
    printf("Prefix Expression: %s\n", prefix);

    return 0;
}

以上是一个基于栈的中缀转前缀的算法实现,它将输入的中缀表达式转换为前缀表达式并输出。代码中使用了一个字符数组来模拟栈的数据结构,通过遍历输入的中缀表达式,根据运算符的优先级和栈的操作来完成转换。

注意:以上代码仅作为示例,实际应用中可能需要根据具体需求进行适当的修改和完善。

这是一个用 C 语言实现的中缀转前缀算法,详细说明和代码示例已经提供,希望能帮助到你。