栈和队列的应用之"表达式求值"和"魔王语言"

一:魔王语言

[问题描述] 有一个魔王总是使用自己的一种非常精练而又抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1) α -> β1β2…βm
(2)(θδ1δ2…δn)->θ δn θδn-1…θδ1 θ
在这两种形式中,从左到右均表示解释。试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。
[基本要求] 用下述两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言的词汇;小写字母表示人的语言词汇;希腊字母表示可以用大写字母或小写字母代换的变量。魔王语言可含人的词汇。
(1)B -> tAdA
(2)A -> sae

这个问题描述第一次接触的人有点难理解啊,举个例子,B(ehnxgz)B怎么解释呢?
1:对于”B”,就是tAdA = tsaedsae
2:对于括号中的是人的语言:首先取出第一个字母e,然后让它和最后一个z结合,同理,一直到e本身,但是它本身只输出一次,也就是”ezegexenehe”这个序列

解决方法就是用栈和队列,这不说了和没说一样吗,那就点这里,代码中有注释,欢迎交流评论。

二:表达式求值

主要是利用栈的”先进后出”的思想方便我们可以把目前可以运算的数字得到参与运算,首先初始化两个栈,一个作为运算符栈,一个作为数字栈,我们规定输入的表达式必须以“#”结尾,实际上也可以不以”#”,运算符栈底初始化的时候初始化为’\n’就行了,但是不太好看,下面再说说我们每次读到一个符号之后应该干什么。
1:读到的是数字,直接入数字栈。
2:读到的是运算符,则与当前栈顶元素比较,如果大于当前栈顶元素,将其入操作符栈;如果小于,从操作符栈顶取出一个操作符,从数字栈顶取出两个操作数,然后计算,之后不用读取,我的程序只有左右括号相遇时才会等于,那么就将括号出栈忽略,然后运算就行了,当两个运算符优先级再我们看来一样的时候,实际上做的处理是小于的情况,因为实际上如果运算符优先级一样,我们就应该运算。详细代码点这里

posted on 2015-11-14 23:39  杨博东的博客  阅读(76)  评论(0编辑  收藏  举报

导航