前缀、中缀、后缀表达式的相互转换方法

前缀式、中缀式、后缀式相互转换

一. 中缀式转化成前缀式和后缀式:

一个中缀式到其他式子的转换方法

 

这里我给出一个中缀表达式

 

a + b * c - ( d + e )

 

第一步:按照运算符的优先级对所有的运算单位加括号

 

​ 式子变成:( ( a + ( b * c ) ) - ( d + e ) )

 

第二步:转换前缀与后缀表达式

 

中缀转前缀:

把运算符号移动到对应的括号前面

则变成:- ( + ( a * ( b c ) ) + ( d e ) )

 

把括号去掉:- + a * b c + d e 前缀式子出现

 

中缀转后缀:

把运算符号移动到对应的括号后面

则变成:( ( a ( b c ) * ) + ( d e ) + ) -

 

把括号去掉:a b c * + d e + - 后缀式子出现

 

二. 前缀式转化成中缀式:

​ + a * b c + d e

 

从后往前遇到运算符,将其与后面两个运算数结合,加上括号,当成新的运算数(例如:* b c 加上括号,变成 ( * b c )一个整体,作为运算数)

 

变成:( - ( + a ( * b c ) ) ( + d e ) )

 

将运算符加在括号内运算数中间。变成:

 

( ( a + ( b * c ) ) - ( d + e ) )

 

去掉部分括号:a + b * c - ( d + e )

 

(最后去掉的是不影响运算式含义的多余括号)

 

三. 后缀式转化成中缀式:

a b c * + d e + -

 

从前往后遇到运算符,将其与前面两个运算数结合,加上括号,当成新的运算数

 

变成:( ( a ( b c * ) + ) ( d e + ) - )

 

将运算符加在括号内运算数中间。变成:

 

( ( a + ( b * c ) ) - ( d + e ) )

 

去掉部分括号:a + b * c - ( d + e )

 

(最后去掉的是不影响运算式含义的多余括号)

前缀表达式从右往左遍历,遇到操作数就直接输出到后缀表达式中,遇到运算符则将其压入栈中,等到遇到下一个操作数时,将栈顶运算符取出与该操作数和前面的运算符进行运算,将结果输出到后缀表达式中。最后将栈中的所有运算符依次弹出并输出到后缀表达式中即可。 以下是 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 == '/'; } 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'; } int main() { char prefix[100], postfix[100] = ""; printf("Enter prefix expression: "); gets(prefix); prefix_to_postfix(prefix, postfix); printf("Postfix expression: %s", postfix); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值