Dijkstra 调度场算法 Python实现 一
调度场算法(Shunting Yard Algorithm)是一个用于将中缀表达式转换为后缀表达式的经典算法,由 Edsger Wybe Dijkstra 引入,因其操作类似于火车编组场而得名。
——维基百科
目标阐述:
将中缀表达式转换为后缀表达式(Reverse Polish Notation:RPN 逆波兰式)
参与运算的数据的正则表示为:[-]{,}形式的十进制数
运算符优先级:(从高到低)
————————————————————————
( ) 括号
/ * % 除乘余
+ - 加减
————————————————————————
解:
第一步:使用正则词法分析器flex生成一个词法分析器,以处理输入的中缀表达式。
从stdin接收输入,检测非法字符,并将处理后的中缀表达式输出到stdout。
%option noyywrap
%{
#include<stdio.h>
#include<stdlib.h>%} %%
[-]+ { printf("%s ",yytext); }
[()*/%+-] { printf("%s ",yytext); }
[[:space:]] {}
. { printf("\nError\n");exit(); }
%% int main()
{
yylex();
printf("\n");
return ;
}
第二步:使用Python进行转换。
从stdin接收一定格式的中缀表达式字符流,检测是否在词法分析器处理过程中出错,然后使用调度场算法处理数据,得到rpn列表。
import sys line=sys.stdin.readline()
line2=sys.stdin.readline() if len(line2)>0:
sys.stderr.write("Syntax Error after : ")
sys.stderr.write(line)
sys.stderr.write("\n")
exit(1) lis=line.split(' ')
lis.pop()
lis_old=lis[:]
lis.reverse() oplis=[]
rpnlis=[]
str=''
arith_op="+-*/%" # '(' ')' [0-9]+
prior={ '/':1,'*':1,'%':1, '+':2,'-':2 } while len(lis)>0:
str=lis.pop()
if str=='(':
oplis.append('(')
elif str.isdigit():
rpnlis.append(str)
elif len(str)==1 and arith_op.find(str[0])!=-1:
if len(oplis)==0 or oplis[len(oplis)-1]=='(':
oplis.append(str)
else:
while len(oplis)>0 and oplis[len(oplis)-1]!='(' \
and prior[oplis[len(oplis)-1]]<=prior[str]:
rpnlis.append(oplis.pop())
oplis.append(str)
elif str==')':
while len(oplis)>0 and oplis[len(oplis)-1]!='(':
rpnlis.append(oplis.pop())
if len(oplis)>0:
oplis.pop()
else:
sys.stderr.write("Syntax Error while translating : Expected '('")
sys.stderr.write("\n")
exit(2)
else:
sys.stderr.write("Syntax Error : unkown notation -->")
sys.stderr.write(str)
sys.stderr.write("\n")
exit(3)
while len(oplis)>0 :
if oplis[len(oplis)-1]!='(':
rpnlis.append(oplis.pop())
else:
sys.stderr.write("Syntax Error while translating : Unexpected '('")
sys.stderr.write("\n")
exit(1) print lis_old
for i in lis_old:
sys.stdout.write(i)
print ''
print rpnlis
for i in rpnlis:
print i,
print '' exit(0)
实验结果:

目前程序的局限:
未进行语法检测。
不支持函数、变量标识。
附录:

算法示意图,使用了3个空间。输入用符号代替,如果输入是一个数字则直接进输出队列,即图中 b),d),f),h)。如果输入是运算符,则压入操作符堆栈,即图中 c),e),但是,如果输入运算符的优先级低于或等于运算符栈顶的操作符优先级,则栈内元素进入输出队列(循环判定),输入操作符压入运算符堆栈,即图中 g)。 最后,运算符堆栈内元素入输出队列,算法结束。

附录中资料摘自维基百科•调度场算法词条。
Dijkstra 调度场算法 Python实现 一的更多相关文章
- shunting-yard 调度场算法、中缀表达式转逆波兰表达式
中缀表达式 1*(2+3) 这就是一个中缀表达式,运算符在数字之间,计算机处理前缀表达式和后缀表达式比较容易,但处理中缀表达式却不太容易,因此,我们需要使用shunting-yard Algorith ...
- 调度场算法&&中缀表达式=>后缀表达式
#include<stdio.h> #include<string.h> int main(void){ char ch,stro[1001],stack[1001]; int ...
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...
- Dijkstra最短路算法
Dijkstra最短路算法 --转自啊哈磊[坐在马桶上看算法]算法7:Dijkstra最短路算法 上节我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最 ...
- pageRank算法 python实现
一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...
- 常见排序算法-Python实现
常见排序算法-Python实现 python 排序 算法 1.二分法 python 32行 right = length- : ] ): test_list = [,,,,,, ...
- kmp算法python实现
kmp算法python实现 kmp算法 kmp算法用于字符串的模式匹配,也就是找到模式字符串在目标字符串的第一次出现的位置比如abababc那么bab在其位置1处,bc在其位置5处我们首先想到的最简单 ...
- Dijkstra和Prim算法的区别
Dijkstra和Prim算法的区别 1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的点集合A ...
- 【坐在马桶上看算法】算法7:Dijkstra最短路算法
上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径 ...
随机推荐
- XMPP协议相关知识
XMPP协议的组成 主要的XMPP 协议范本及当今应用很广的XMPP 扩展: RFC 3920 XMPP:核心.定义了XMPP 协议框架下应用的网络架构,引入了XML Stream(XML 流)与XM ...
- hexo的环境搭建
今天开始折腾下hexo,安装起来还是有点坑,简单记录下,会不断更新. 网上安装的文章多不胜数,当然首先还是得去看看官方的文档. 按照官方的文档,不知大家是否顺利,本人搭建环境的时候并不顺利. 明确要安 ...
- sysbench工具使用
--------------需要的软件包-------------- automake libtool sysbench-1.0.zip --------------安装-------------- ...
- javascript中typeof用法
JS中的变量是松散类型(即弱类型)的,可以用来保存任何类型的数据. typeof 可以用来检测给定变量的数据类型,可能的返回值: 1. 'undefined' --- 这个值未定义: 2. 'bool ...
- Codeforces 620E New Year Tree【线段树傻逼题】
LINK 题目大意 给你一棵树 让你支持子树染色,子树查询颜色个数,颜色数<=60, 节点数<=4e5 思路 因为颜色数很少,考虑状态压缩变成二进制 然后直接在dfs序上用线段树维护就可以 ...
- 每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译
如果你干预到了项目的编译过程,可能就需要考虑到差量编译了.不然--当你的项目大起来的时候,就会感受到每次都重新编译时,每次重复调试的过程都要进行漫长等待时的绝望和无奈. 如果你正遭遇差量编译失效,每次 ...
- php中strstr、strchr、strrchr、substr、stristr
一.strstr 和 strcchr的区别 strstr 显示第一次找到,要查找的字符串,以及后面的字符串. strrchr 显示最后一次找到,要查找的字符串,以及后面的字符串. 二.strstr ...
- flex 伸缩布局
伸缩布局 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便.CSS3在布局方面做了非常大的改进,使得我们对块级元素 ...
- VS 2013 简体中文 专业版 下载地址。
官方原始链接:http://download.microsoft.com/download/7/A/C/7AC27F37-FDFE-4991-B18A-962E26E31BD1/VS2013_RTM_ ...
- EditPlus 3.41 p1115 0728注册码
EditPlus (2012-7-28 epp341p1115_0728) 注册码: 注册名:Free User 注册码:6AC8D-784D8-DDZ95-B8W3A-45TFA 注册名:Www.S ...