📅  最后修改于: 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 语言实现的中缀转前缀算法,详细说明和代码示例已经提供,希望能帮助到你。