前缀表达式/中缀表达式/后缀表达式

前缀表达式/中缀表达式/后缀表达式

  1. 中缀表达式就是平常的表达式,如(3+4)*5-6=29
  2. 前缀表达式又称为波兰式,也就是运算符位于数字前面,如 -*+3456
  3. 后缀表达式又称为逆波兰式,也就是运算符位于数字后面,如 3 4 + 5 × 6 -
  • 后缀表达式转中缀表达式,ab+cd+*
后缀表达式转为中缀表达式要点:遇到操作数都进栈,等到碰到运算符就把栈顶两个元素出栈,运算后再入栈,直到结束。
1. a入栈,b入栈,`栈为 a b`
2. 遇到运算符+,b出栈,a出栈,运算为(a+b),再入栈,栈为`(a+b)`
3. c入栈,d入栈,栈为`(a+b) c d`
4. 遇到运算符+,d出栈,c出栈,运算为(c+d),入栈,结果为`(a+b) (c+d)`
5.遇到运算符*,栈顶两个元素出栈,运算结果为(a+b)*(c+d)
  • 后缀表达式转中缀表达式,“3 4 + 5 × 6 -” => ((3+4)*5)-6 => 29

  • 中缀表达式转为后缀表达式(从左到右扫描)
  • 分为两个栈,结果栈和运算栈,遇到的情况有
1. 如果是操作数(数字、字母),则进入结果栈
2. 如果是左括号,那么入运算栈;
3. 如果是右括号,那么把运算栈的栈顶元素出栈,入栈到结果栈,知道遇到左括号,遇到左括号后,这一对括号都消灭
4.1 如果是运算符,如果运算栈为空,那么入栈
4.2 如果是运算符,此时运算栈顶运算符不为左括号!!!,且栈里不存在优先级大于或等于该运算符的运算符,则该运算符入栈,
否则大于等于该运算符的其他运算符先出栈再入栈到结果栈
4.3 如果是运算符,此时栈顶运算符是左括号,那么入栈
  • 已知一算数表达式的中缀表达式为 a*f+(b-c/d)*e,其后缀形式
  • 首先a是操作数,进结果栈;结果栈为 a
    • 是运算符,运算栈空,进运算栈
  • f是操作数,进结果栈 结果栈为 a f
  • +是运算符,但是栈中存在优先级大于等于的*,所以 * 先出栈,然后 * 入运算栈 结果栈为 a f *
  • (是左括号,入运算栈,运算栈为 + (
  • b是操作数,入结果栈,结果栈 a f * b
  • -是运算符,栈顶元素是左括号,所以-入运算栈 运算栈 + ( -
  • c是操作数,入结果栈, 结果栈 a f * b c
  • /是运算符,运算栈顶元素不是左括号,运算栈 + ( -不存在优先级大于等于 / 的元素,所以 / 入运算栈
  • d是操作数,d入结果栈,结果栈 a f * b c d
  • )是右括号,所以运算栈的栈顶元素出栈,知道左括号,入栈后进到结果栈
  • 此时运算栈是 + ( - / ,所以结果栈变为 a f * b c d / -,运算栈变为 +,左右括号消灭了
  • 然后*是运算符,运算栈中不存在大于等于的元素,所以入运算栈,运算栈为+ *
  • e是操作数,e入结果栈,结果栈为a f * b c d / - e,
  • 扫描结束,所以运算栈全部出栈到结果栈,为 a f * b c d / - * +
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前缀表达式中缀表达式转换成后缀表达式的方法是类似的,都可以利用栈来实现。 对于前缀表达式,我们可以从右往左遍历,遇到操作数直接输出到后缀表达式中,遇到运算符则将其压入栈中,并将栈顶的两个操作数弹出进行运算后再将结果压入栈中。最后将栈中剩余的运算符依次弹出并输出到后缀表达式中即可。 对于中缀表达式,我们可以从左往右遍历,遇到操作数直接输出到后缀表达式中,遇到运算符则判断其与栈顶运算符的优先级,如果栈顶运算符的优先级高于或等于当前运算符,则弹出栈顶运算符并输出到后缀表达式中,直到栈为空或栈顶运算符的优先级低于当前运算符,然后将当前运算符压入栈中。最后将栈中剩余的运算符依次弹出并输出到后缀表达式中即可。 以下是 C 语言代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STACK_SIZE 100 typedef struct stack { char data[MAX_STACK_SIZE]; int top; } Stack; void push(Stack *s, char c) { if (s->top == MAX_STACK_SIZE - 1) { printf("Stack overflow!\n"); exit(1); } s->data[++s->top] = c; } char pop(Stack *s) { if (s->top == -1) { printf("Stack underflow!\n"); exit(1); } return s->data[s->top--]; } int is_operator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } int get_operator_priority(char c) { if (c == '*' || c == '/') { return 2; } else if (c == '+' || c == '-') { return 1; } else { return 0; } } void prefix_to_postfix(char *prefix, char *postfix) { Stack stack; stack.top = -1; int len = strlen(prefix); for (int i = len - 1; i >= 0; i--) { if (is_operator(prefix[i])) { char op1 = pop(&stack); char op2 = pop(&stack); postfix[strlen(postfix)] = op1; postfix[strlen(postfix)] = op2; postfix[strlen(postfix)] = prefix[i]; push(&stack, postfix[strlen(postfix) - 1]); } else { push(&stack, prefix[i]); } } while (stack.top != -1) { postfix[strlen(postfix)] = pop(&stack); } postfix[strlen(postfix)] = '\0'; } void infix_to_postfix(char *infix, char *postfix) { Stack stack; stack.top = -1; int len = strlen(infix); for (int i = 0; i < len; i++) { if (is_operator(infix[i])) { while (stack.top != -1 && get_operator_priority(stack.data[stack.top]) >= get_operator_priority(infix[i])) { postfix[strlen(postfix)] = pop(&stack); } push(&stack, infix[i]); } else if (infix[i] == '(') { push(&stack, infix[i]); } else if (infix[i] == ')') { while (stack.top != -1 && stack.data[stack.top] != '(') { postfix[strlen(postfix)] = pop(&stack); } if (stack.top == -1) { printf("Invalid expression!\n"); exit(1); } pop(&stack); } else { postfix[strlen(postfix)] = infix[i]; } } while (stack.top != -1) { if (stack.data[stack.top] == '(') { printf("Invalid expression!\n"); exit(1); } postfix[strlen(postfix)] = pop(&stack); } postfix[strlen(postfix)] = '\0'; } int main() { char expression[100], postfix[100] = ""; printf("Enter expression: "); gets(expression); infix_to_postfix(expression, postfix); printf("Postfix expression: %s", postfix); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值