中缀表达式转后缀表达式的C语言实现
中缀表达式转后缀表达式(也称为逆波兰表示法)是编译原理中的一个经典问题,下面我将提供一个完整的C语言实现,包括算法说明和代码示例。

(图片来源网络,侵删)
算法思路
- 初始化一个空栈用于操作符
- 从左到右扫描中缀表达式中的每个字符
- 遇到操作数时,直接输出
- 遇到左括号时,压入栈中
- 遇到右括号时,弹出栈中元素并输出,直到遇到左括号(左括号不输出)
- 遇到操作符时:
- 比较其与栈顶操作符的优先级
- 栈顶操作符优先级大于等于当前操作符时,弹出栈顶操作符并输出
- 将当前操作符压入栈中
- 扫描结束后,将栈中剩余操作符依次弹出并输出
C语言实现代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_EXPR_LEN 100
// 定义操作符优先级
int precedence(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '^':
return 3;
default:
return 0;
}
}
// 判断是否为操作符
int isOperator(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^';
}
// 中缀转后缀
void infixToPostfix(char* infix, char* postfix) {
char stack[MAX_EXPR_LEN];
int top = -1;
int j = 0; // 后缀表达式索引
for (int i = 0; infix[i] != '\0'; i++) {
char ch = infix[i];
// 跳过空格
if (ch == ' ') continue;
// 如果是操作数,直接输出
if (isalnum(ch)) {
postfix[j++] = ch;
}
// 如果是左括号,压入栈中
else if (ch == '(') {
stack[++top] = ch;
}
// 如果是右括号,弹出栈中元素直到遇到左括号
else if (ch == ')') {
while (top != -1 && stack[top] != '(') {
postfix[j++] = stack[top--];
}
top--; // 弹出左括号但不输出
}
// 如果是操作符
else if (isOperator(ch)) {
while (top != -1 && precedence(stack[top]) >= precedence(ch)) {
postfix[j++] = stack[top--];
}
stack[++top] = ch;
}
}
// 弹出栈中剩余操作符
while (top != -1) {
postfix[j++] = stack[top--];
}
postfix[j] = '\0'; // 添加字符串结束符
}
int main() {
char infix[MAX_EXPR_LEN];
char postfix[MAX_EXPR_LEN];
printf("请输入中缀表达式: ");
fgets(infix, MAX_EXPR_LEN, stdin);
infix[strcspn(infix, "\n")] = '\0'; // 去除换行符
infixToPostfix(infix, postfix);
printf("后缀表达式: %s\n", postfix);
return 0;
}
代码说明
- precedence函数:返回操作符的优先级,乘除优先级高于加减,^(幂运算)优先级最高
- isOperator函数:判断字符是否为操作符
- infixToPostfix函数:核心转换函数,使用栈来处理操作符
- main函数:获取用户输入的中缀表达式,调用转换函数并输出结果
示例运行
输入:
a + b * c - (d / e ^ f)
输出:
abc*+def/^-
扩展功能
如果需要支持多位数字或小数,可以修改代码中处理操作数的部分:
// 修改后的操作数处理部分
if (isdigit(ch) || ch == '.') {
// 处理多位数或小数
while (isdigit(infix[i]) || infix[i] == '.') {
postfix[j++] = infix[i++];
}
i--; // 回退一个字符
postfix[j++] = ' '; // 添加分隔符
}
这个实现可以处理基本的四则运算和括号,如果需要支持更多运算符或功能,可以相应扩展precedence函数和isOperator函数。

(图片来源网络,侵删)
