「数据结构」三步搞定表达式中缀转后缀 手算法 通俗易懂 C语言

表达式中缀转后缀

举个例子,一个式子:

( 5 + 20 + 1 * 3 ) / 14

如何把该式子转换成后缀表达式呢?其实就是分三步:

  1. 按运算符优先级对所有运算符和它的运算数加括号 (原本有括号的不用加)。
  2. 把运算符移到对应的括号后。
  3. 去掉括号。

对应的具体实现为:

  1. ( ( ( 5 + 20 ) + ( 1 * 3 ) ) / 14 )
  2. ( ( ( 520 ) + ( 13 ) * ) + 14) /
  3. 520 + 13 * + 14 /
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个比较复杂的问题,需要用到栈和逆波兰表达式的知识。以下是一个参考实现: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LENGTH 100 // 最大表达式长度 typedef struct { int data[MAX_LENGTH]; int top; } Stack; void initStack(Stack *stack) { stack->top = -1; } void push(Stack *stack, int value) { stack->top++; stack->data[stack->top] = value; } int pop(Stack *stack) { int value = stack->data[stack->top]; stack->top--; return value; } int peek(Stack *stack) { return stack->data[stack->top]; } int isEmpty(Stack *stack) { return stack->top == -1; } int isOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } int getPriority(char c) { if (c == '+' || c == '-') { return 1; } else if (c == '*' || c == '/') { return 2; } else { return 0; } } void infixToPostfix(char *infix, char *postfix) { Stack operatorStack; initStack(&operatorStack); int i, j; for (i = 0, j = 0; infix[i] != '\0'; i++) { char c = infix[i]; if (isdigit(c)) { postfix[j++] = c; } else if (isOperator(c)) { while (!isEmpty(&operatorStack) && isOperator(peek(&operatorStack)) && getPriority(c) <= getPriority(peek(&operatorStack))) { postfix[j++] = pop(&operatorStack); } push(&operatorStack, c); } else if (c == '(') { push(&operatorStack, c); } else if (c == ')') { while (peek(&operatorStack) != '(') { postfix[j++] = pop(&operatorStack); } pop(&operatorStack); } } while (!isEmpty(&operatorStack)) { postfix[j++] = pop(&operatorStack); } postfix[j] = '\0'; } int evaluatePostfix(char *postfix) { Stack valueStack; initStack(&valueStack); int i; for (i = 0; postfix[i] != '\0'; i++) { char c = postfix[i]; if (isdigit(c)) { push(&valueStack, c - '0'); } else if (isOperator(c)) { int rightOperand = pop(&valueStack); int leftOperand = pop(&valueStack); switch (c) { case '+': push(&valueStack, leftOperand + rightOperand); break; case '-': push(&valueStack, leftOperand - rightOperand); break; case '*': push(&valueStack, leftOperand * rightOperand); break; case '/': push(&valueStack, leftOperand / rightOperand); break; } } } return pop(&valueStack); } int main() { char infix[MAX_LENGTH]; char postfix[MAX_LENGTH]; printf("请输入中缀表达式:"); scanf("%s", infix); infixToPostfix(infix, postfix); printf("后缀表达式为:%s\n", postfix); int result = evaluatePostfix(postfix); printf("计算结果为:%d\n", result); return 0; } ``` 该程序首先定义了一个栈结构体,并实现了栈的基本操作。然后定义了一些辅助函数,如判断字符是否为运算符、获取运算符优先级等。主要的两个函数是 `infixToPostfix` 和 `evaluatePostfix`,分别用于将中缀表达式换为后缀表达式并计算结果。在 `infixToPostfix` 中,我们遍历中缀表达式的每个字符,如果是数字就直接输出到后缀表达式中,如果是左括号就入栈,如果是右括号就把栈中的运算符弹出直到遇到左括号为止,然后把左右括号都丢弃。如果是运算符,就把栈中优先级大于等于自己的运算符都弹出,然后自己入栈。最后把栈中剩余的运算符都弹出到后缀表达式中。在 `evaluatePostfix` 中,我们遍历后缀表达式的每个字符,如果是数字就入栈,如果是运算符就弹出栈顶的两个数字进行运算,然后把结果入栈。最终栈中剩下的数字就是计算结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值