将中缀表达式转换为后缀表达式的简便方法

参考文献:颜晶晶 张涛《将中缀表达式转换成后缀表达式的三种方法》

http://blog.csdn.net/glldc/article/details/1818787

第一种:利用栈来实现,该方法为常规方法,论文中也有介绍,但本人认为,该方法不利于记忆,且费时,不足以应付考试的要求。再此不再赘述。

第二种:后序遍历二叉树法:

例:将中缀表达式a+(b-c)*d转换成后缀表达式

第一步:画出其对应的二叉树;

 

后续遍历该二叉树,得到后缀表达式为:a b c - d * +

 附:后续遍历的方法:后序遍历指在访问根结点、遍历左子树与遍历右子树三者中,首先遍历左子树,然后遍历右子树,最后遍历访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。

 第三种方法:加括号法--最简便最有创新性的方法,足以应付考试。

          加括号法就是先将待求的中级表达式依次排开, 再将每一步要计算的表达式加上括号, 最后将每个运算符移到其所在括号的外面, 这样, 从左到右扫描得到的序列去掉括号后就
是后缀表达式。

仍然是上例:

第一步:按优先级别, 有括号先求括号里的原则, 将每一步要计算的表达式加上括号, 得到表达式为

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

 第二步:将每个运算符移到其所在括号的外面, 即外移一层

abc-d*+

 再例:

将中缀表达式 a+b*c-(d+e)转换为后缀表达式:

第一步:按照运算符的优先级对所有的运算单位加括号~
        式子变成了:((a+(b*c))-(d+e))
后缀:把运算符号移动到对应的括号后面
              则变成拉:((a(bc)* )+ (de)+ )-
              把括号去掉:abc*+de+-  后缀式得到

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中缀表达式转换后缀表达式是一种常用的算法问题,下面是一个用C语言实现的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义栈结构及相关操作 typedef struct Stack { char data[100]; // 假设栈存储的元素为字符类型,最大容量为100 int top; // 栈顶指针 } Stack; // 初始化栈 void initStack(Stack *stack) { stack->top = -1; } // 判断栈是否为空 int isEmpty(Stack *stack) { return stack->top == -1 ? 1 : 0; } // 入栈 void push(Stack *stack, char c) { stack->data[++(stack->top)] = c; } // 出栈 char pop(Stack *stack) { return stack->data[(stack->top)--]; } // 获取栈顶元素 char getTop(Stack *stack) { return stack->data[stack->top]; } // 判断运算符的优先级 int priority(char c) { switch (c) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } // 中缀表达式后缀表达式 void infixToPostfix(char *infix, char *postfix) { Stack stack; // 定义栈 initStack(&stack); // 初始化栈 int i = 0, j = 0; int length = strlen(infix); for (i = 0; i < length; i++) { char c = infix[i]; if (c >= '0' && c <= '9') { // 如果字符是数字,直接加入后缀表达式 postfix[j++] = c; } else if (c == '(') { // 如果字符是左括号,入栈 push(&stack, c); } else if (c == ')') { // 如果字符是右括号,将栈中的运算符弹出,直到遇到左括号 while (!isEmpty(&stack) && getTop(&stack) != '(') { postfix[j++] = pop(&stack); } if (!isEmpty(&stack) && getTop(&stack) == '(') { pop(&stack); // 弹出左括号 } } else { // 如果字符是运算符 while (!isEmpty(&stack) && priority(getTop(&stack)) >= priority(c)) { postfix[j++] = pop(&stack); // 当前运算符优先级小于等于栈顶运算符优先级时,将栈顶运算符弹出 } push(&stack, c); // 将当前运算符入栈 } } // 将栈中剩余运算符弹出 while (!isEmpty(&stack)) { postfix[j++] = pop(&stack); } postfix[j] = '\0'; // 结尾添加字符串结束符 } int main() { char infix[100]; // 存储中缀表达式 char postfix[100]; // 存储后缀表达式 printf("请输入中缀表达式:"); scanf("%s", infix); infixToPostfix(infix, postfix); printf("后缀表达式为:%s\n", postfix); return 0; } ``` 以上是一个简单的中缀表达式后缀表达式的代码示例,通过定义栈结构及相关操作,实现了中缀表达式转换后缀表达式的功能。输入一个中缀表达式,程序将输出对应的后缀表达式。这段代码可以覆盖简单的表达式,对于复杂的表达式可能需要进行扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值