下面是一个将中序表达式转换为后序表达式的C语言代码:

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

#define MAX_SIZE 100

// 定义栈结构
typedef struct {
    char data[MAX_SIZE];
    int top;
} Stack;

// 初始化栈
void initStack(Stack* stack) {
    stack->top = -1;
}

// 判断栈是否为空
int isEmpty(Stack* stack) {
    return stack->top == -1;
}

// 判断栈是否已满
int isFull(Stack* stack) {
    return stack->top == MAX_SIZE - 1;
}

// 入栈
void push(Stack* stack, char c) {
    if (isFull(stack)) {
        printf("Stack is full.\n");
        return;
    }
    stack->data[++stack->top] = c;
}

// 出栈
char pop(Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty.\n");
        return '\0';
    }
    return stack->data[stack->top--];
}

// 获取栈顶元素
char peek(Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack is empty.\n");
        return '\0';
    }
    return stack->data[stack->top];
}

// 判断运算符的优先级
int getPriority(char op) {
    switch (op) {
        case '+':
        case '-':
            return 1;
        case '*':
        case '/':
            return 2;
        case '^':
            return 3;
        default:
            return 0;
    }
}

// 将中序表达式转换为后序表达式
void infixToPostfix(char* infix, char* postfix) {
    Stack stack;
    initStack(&stack);

    int infixLen = strlen(infix);
    int postfixIndex = 0;

    for (int i = 0; i < infixLen; i++) {
        char c = infix[i];

        // 如果是操作数,直接输出到后序表达式中
        if (c >= '0' && c <= '9') {
            postfix[postfixIndex++] = c;
        }
        // 如果是左括号,入栈
        else if (c == '(') {
            push(&stack, c);
        }
        // 如果是右括号,将栈中的操作符依次出栈并输出到后序表达式中,直到遇到左括号
        else if (c == ')') {
            while (!isEmpty(&stack) && peek(&stack) != '(') {
                postfix[postfixIndex++] = pop(&stack);
            }
            // 弹出左括号
            if (!isEmpty(&stack) && peek(&stack) == '(') {
                pop(&stack);
            }
        }
        // 如果是运算符
        else {
            // 当栈非空且栈顶元素的优先级大于等于当前运算符时,将栈顶元素出栈并输出到后序表达式中
            while (!isEmpty(&stack) && getPriority(peek(&stack)) >= getPriority(c)) {
                postfix[postfixIndex++] = pop(&stack);
            }
            // 当前运算符入栈
            push(&stack, c);
        }
    }

    // 将栈中剩余的操作符出栈并输出到后序表达式中
    while (!isEmpty(&stack)) {
        postfix[postfixIndex++] = pop(&stack);
    }

    // 添加字符串结束符
    postfix[postfixIndex] = '\0';
}

int main() {
    char infix[MAX_SIZE];
    printf("Enter an infix expression: ");
    fgets(infix, MAX_SIZE, stdin);
    infix[strlen(infix) - 1] = '\0';  // 移除换行符

    char postfix[MAX_SIZE];
    infixToPostfix(infix, postfix);
    printf("Postfix expression: %s\n", postfix);

    return 0;
}

使用示例:

Enter an infix expression: (1+2)*3-4/5
Postfix expression: 12+3*45/-

这段代码使用了一个栈数据结构来存储运算符,并按照运算符的优先级将中序表达式转换为后序表达式


原文地址: https://www.cveoy.top/t/topic/hBNK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录