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

一:魔王语言

[问题描述] 有一个魔王总是使用自己的一种非常精练而又抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(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:读到的是运算符,则与当前栈顶元素比较,如果大于当前栈顶元素,将其入操作符栈;如果小于,从操作符栈顶取出一个操作符,从数字栈顶取出两个操作数,然后计算,之后不用读取,我的程序只有左右括号相遇时才会等于,那么就将括号出栈忽略,然后运算就行了,当两个运算符优先级再我们看来一样的时候,实际上做的处理是小于的情况,因为实际上如果运算符优先级一样,我们就应该运算。详细代码点这里

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨博东的博客

请我喝瓶可乐鼓励下~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值