中缀转后缀表达式C语言实现步骤如何?

99ANYc3cd6
预计阅读时长 11 分钟
位置: 首页 C语言 正文

中缀表达式转后缀表达式的C语言实现

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

中缀表达式转后缀表达式 c语言
(图片来源网络,侵删)

算法思路

  1. 初始化一个空栈用于操作符
  2. 从左到右扫描中缀表达式中的每个字符
  3. 遇到操作数时,直接输出
  4. 遇到左括号时,压入栈中
  5. 遇到右括号时,弹出栈中元素并输出,直到遇到左括号(左括号不输出)
  6. 遇到操作符时:
    • 比较其与栈顶操作符的优先级
    • 栈顶操作符优先级大于等于当前操作符时,弹出栈顶操作符并输出
    • 将当前操作符压入栈中
  7. 扫描结束后,将栈中剩余操作符依次弹出并输出

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;
}

代码说明

  1. precedence函数:返回操作符的优先级,乘除优先级高于加减,^(幂运算)优先级最高
  2. isOperator函数:判断字符是否为操作符
  3. infixToPostfix函数:核心转换函数,使用栈来处理操作符
  4. 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函数。

中缀表达式转后缀表达式 c语言
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
dede自定义表单数据如何调用?
« 上一篇 01-10
dede用户名不存在 数据库
下一篇 » 01-10

相关文章

取消
微信二维码
支付宝二维码

目录[+]