中序式转后序式,前序式(C/python)
来源:互联网 发布:windows官网下载 编辑:程序博客网 时间:2024/06/10 23:37
中序表达式 (a+b)*(c+d)
后续表达式 ab+cd+*
前序表达式 *+ab+cd
说明
平常所使用的运算式,主要是将运算元放在运算子的两旁,例如a+b/d这样的式子,这称之为中序(Infix)表示式,对于人类来说,这样的式子很容易理 解,但由于电脑执行指令时是有顺序的,遇到中序表示式时,无法直接进行运算,而必须进一步判断运算的先后顺序,所以必须将中序表示式转换为另一种表示方法(前序,后序)。
后序:
以ab+cd+*为例,从左至右,先取出两个操作数a,b和一个操作符+,
计算(a+b)记为A,将结果A返回字符串中,即Acd+*,再连续取出A,c,d,直到取到一个运算符+,将与运算符最近的两个c,d进行计算,即(c+d)记为B, 将B返回字符串,
即AB*,取出A,B,操作符,即A乘B
前序:
*+ab+cd 类似于后序,但是是从右至左操作
中序转前序步骤
一,从字符串(从左至右)中取出一个字符
1,如果是操作数,则直接输出
2,如果是“(”直接压入栈中
3,如果是运算符但不是‘(’,‘)’,则不断进行以下处理
(1)如果栈为空,则运算符入栈
(2)如果栈顶为‘(’则此运算符进栈
(3)如果此运算符与栈顶的优先级相同或者更高,则入栈
(4)如果前三个都不满足,则运算符连续出栈,直到满足上面三个之一,然后该运算符进栈
(5)如果为‘)’,运算符连续出栈,直到遇到‘(’,
将‘(’出栈丢之
中序转前序
一,从字符串(从右至左)中取出一个字符(或者先将字符串反转,就从左至右,对结果再反转即最终结果)
1,如果是操作数,则直接输出
2,如果是“)”直接压入栈中
3,如果是运算符但不是‘(’,‘)’,则不断进行以下处理
(1)如果栈为空,则运算符入栈
(2)如果栈顶为‘)’则此运算符进栈
(3)如果此运算符与栈顶的优先级相同或者更高,则入栈
(4)如果前三个都不满足,则运算符连续出栈,直到满足上面三个之一,然后该运算符进栈
(5)如果为‘(’,运算符连续出栈,直到遇到‘)’,
将‘)’出栈丢之
例子(中转后)
如(a+b)*(c+d)
1,取出‘(’,入栈 , 此时栈为‘(’
2,取出a,直接输出,此时输出为a
3,取出+,满足(2),入栈,此时栈为‘(+’
4,取出b,直接输出,此时输出为ab
5,取出‘)’,满足(5),运算符连续出栈,并将‘)’出栈丢之,+号出栈,此时输出为ab+,栈为空
6,取出*,满足(1),运算符入栈
7,取出’(‘,满足2,入栈,此时栈为*(
8,取出c,直接输出,此时输出为ab+c
9,取出+,满足(2)进栈,此时栈为*(+
10,取出d,直接输出,此时输出ab+cd
11,取出‘)’,满足(5),+出栈,(出栈丢之,此时输出ab+cd+,栈为*
12,乘号出栈,ab+cd+*
C代码(中转后)
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>int zhong_z_hou(char *);//中转后int priority(char);//优先级判断int main(){ char input[80]; printf("请输入一个中序式:"); scanf("%s", input); zhong_z_hou(input); system("pause"); return 0;}int zhong_z_hou(char *arr){ char stack[80] = { '\0' }; int i = 0;//字符串索引 int top = 0; //栈顶 char op; while (1) { op = arr[i]; switch (op) { case '\0': //遇到结束符,打印 while (top > 0) { printf("%c", stack[top]); top--; } printf("\n"); return 0; case '(': if (top < sizeof(stack) / sizeof(char)) { top++; stack[top] = op; } break; case '+': case '-': case '*': case '/': if(priority(op) < priority(stack[top])) { printf("%c", stack[top]); top--; } if(top<sizeof(stack)/sizeof(char)) { top++; stack[top] = op; } break; case ')': while (stack[top] != '(') { printf("%c", stack[top]); top--; } top--; //丢弃'(' break; default: //运算符直接打印 printf("%c", op); break; } i++; }}int priority(char c){ int p = 0; if (c == '+' || c == '-') { p = 1; } if (c == '*' || c == '/') { p = 2; } return p;}
python代码(中转前)
# -*- coding: utf-8 -*-"""Created on Thu Nov 16 19:44:06 2017@author: yangwenbin"""#中序转前序def zhong_z_qian(arr): stack=['\0']*80 save_qian=[] #存放输出的字符 top=0 for i in range(len(arr)-1,-2,-1): if i==-1: while top >0: #print(stack[top],end='') save_qian.append(stack[top]) stack[top]='\0' top-=1 #stack[top]='\0' #break op=arr[i] if op==')': top+=1 stack[top]=op pass elif op=='+' or op=='-' or op=='*' or op=='/': while pre(op)<pre(stack[top]): #print(stack[top],end='') save_qian.append(stack[top]) stack[top]='\0' top-=1 pass if top<len(stack): top+=1 stack[top]=op pass pass elif op=='(': while stack[top]!=')': #print(stack[top],end='') save_qian.append(stack[top]) stack[top]='\0' top-=1 pass stack[top]='\0' top-=1 pass else: #print(op,end='') save_qian.append(op) pass pass return save_qian passdef pre(c): p=0 if c=='+' or c=='-': p=1 pass if c=='*' or c=='/': p=2 pass return pif __name__=="__main__": print("请输入一个中序式:") Input=input() a=zhong_z_qian(Input) b=list(reversed(a))#翻转列表 print(''.join(b))#列表转字符串
- 中序式转后序式,前序式(C/python)
- opencv 读取图片(C/C++/python)
- opencv resize (C/C++/Python)
- opencv resize (C/C++/Python)
- Python调用C/C++(使用SWIG)
- 编写Python扩展(Extending Python with C or C++)
- Python嵌入C++(2)
- lambda表达式(python & C++)
- 八皇后(c/python)
- 格雷码(c/python略)
- python c
- C++/Python
- c++/python
- Python与C之间的相互调用(Python C API及Python ctypes库)
- Python与C之间的相互调用(Python C API及Python ctypes库)【转】
- Python与C之间的相互调用(Python C API及Python ctypes库)
- Python与C之间的相互调用(Python C API及Python ctypes库)
- Python与C之间的相互调用(Python C API及Python ctypes库)
- 大数基础操作 -> JAVA
- tar命令操作学习
- 小东的第一篇博客
- 在线游戏厅源码解读
- 对角矩阵的性质(diagonal matrix)
- 中序式转后序式,前序式(C/python)
- 模板:组合数学
- 从零开始的机器学习生活---决策树
- 域名+CA证书申请
- vbox下安装centos7最小系统配置网络环境双网卡
- Linux内核追踪[4.14] X86的5级页表管理
- java中的八大排序算法
- 54. Spiral Matrix
- sklearn 自带手写字体数据集