表达式计算:中辍转后辍,一元操作符运算

老邓 2010-04-12 09:30:10
中缀转后缀需要处理的有:
1. 操作数,操作符的提取
2. 括号等关系到运算符优先级的符号
3. 一元操作符(如 +(正), -(负)) 等
4. 操作符和操作数的匹配,括号的匹配

基本思路如下:
用一个链表 std::list<ExpressionToken> 储存将要生成的后缀表达式
用一个栈 std::stack<OperatorType> 储存操作符
判断当前节点,如果是操作数,直接加入后缀表达式中,如果是操作符,则比较前一个操作符和当前操作符的优先级,如果前一个操作符优先级较高,则将前一个操作符加入后缀表达式中,否则将操作符压入操作符栈,如果遇到反括号 ')', 则在操作符栈中反向搜索,直到遇到匹配的正括号为止,将中间的操作符依次加到后缀表达式中。

我的问题:如何处理一元操作符,包括 + - ! ?
比如表达式:(-2 - 1) + !((+3 + !0) - -2) || 1
按上面的思路,如何生成后缀表达式?
...全文
1947 95 打赏 收藏 转发到动态 举报
写回复
用AI写文章
95 条回复
切换为时间正序
请发表友善的回复…
发表回复
pcliuguangtao 2011-04-15
  • 打赏
  • 举报
回复
呵呵,恩,有不同的方法实现,下面是我的:
http://blog.csdn.net/pcliuguangtao/archive/2011/04/13/6321777.aspx
ollydbg23 2010-12-28
  • 打赏
  • 举报
回复
另外,wanyouzhu 的代码,似乎开头要加入
#include <stdexcept>

否则编译通不过。
ollydbg23 2010-12-28
  • 打赏
  • 举报
回复
另外,我发现 wanyouzhu 的方法,和codeblocks论坛里面的大牛
http://forums.codeblocks.org/index.php/topic,12013.msg84068.html#msg84068
提供的那个template模板写的头文件的方法很像。
ollydbg23 2010-12-28
  • 打赏
  • 举报
回复
wanyouzhu 写的这个算法真是厉害啊,太赞了!我打算试试,呵呵,用用看。

另外,我看到一个简单的C实现,在这:

http://en.literateprograms.org/Shunting_yard_algorithm_%28C%29
ollydbg23 2010-04-16
  • 打赏
  • 举报
回复
@Loaden
昨天Codeblocks论坛里面的大牛给出了他自己写的一个代码,全部是模板实现的。我看不懂,你可以去看看
Re: Is this something we can solve with the improved CC
老邓 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 87 楼 ollydbg23 的回复:]

@Loaden
昨天Codeblocks论坛里面的大牛给出了他自己写的一个代码,全部是模板实现的。我看不懂,你可以去看看
Re: Is this something we can solve with the improved CC
[/Quote]
下载了,不过没细看。
而且,我已经按自己的预想实现了。经反复测试,是成功的!
I_CAN_FLY_Y 2010-04-15
  • 打赏
  • 举报
回复
看不懂,CAN NOT UNDERSTAND
走好每一步 2010-04-14
  • 打赏
  • 举报
回复
我看过一本算法书,用的是栈实现,我当时看的时候,直接傻掉!犀利!
不过当中没一元操作符。
cj413304161 2010-04-14
  • 打赏
  • 举报
回复
你总是最棒的
cj413304161 2010-04-14
  • 打赏
  • 举报
回复
不错,好好加油,支持
jiangseraph 2010-04-14
  • 打赏
  • 举报
回复
Mark 学习
qj737 2010-04-14
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!!!!!!!!!!
yzh090227 2010-04-13
  • 打赏
  • 举报
回复
这代码也太长了,看不懂。
xhp7185 2010-04-13
  • 打赏
  • 举报
回复
看分来的。。。
贪食蛇男 2010-04-13
  • 打赏
  • 举报
回复
大神.
我来JF的
wuyi8808 2010-04-13
  • 打赏
  • 举报
回复
mark
caidonghen 2010-04-13
  • 打赏
  • 举报
回复
抢个分。
alinchuan 2010-04-13
  • 打赏
  • 举报
回复
楼上的几个台强悍了! 代码都出来了!
这里我就简单说一下算法的数据结构吧:
比较 - + * ! 等运算符 课先给它们定一个权值weight 优先级大的weight大
如:* weight=2 > + weight=1
然后把数和运算符一起放到排序二叉树中 提取时按中序遍历
之后就是 计算了 这里我就不说了 相信你会 !
老邓 2010-04-13
  • 打赏
  • 举报
回复
非常感谢各位!特别感谢 飞雪 wanyouzhu !!
w121640121 2010-04-13
  • 打赏
  • 举报
回复
我觉得在两个+,-之间可以填0,用个特殊字符表示,出栈时将此字符忽略。
入栈时设个标识FLAG,连续压入两个+,-或者+,-前没有数字就添个0。
至于一元操作符,还和我刚才说的一样,置一个最高的优先级,出栈另设规则。
((-2 - 1) + !((+3 + !0) - -2))|| 1
就变成(零 - 2 - 1)+ !((零 + 3 + !0) - 零 - 2) || 1
波兰式好像是 2零-1-零3+0!+零-2-!+1||
去掉零就是 2-1-3+0!+-2-!+1||
加载更多回复(70)

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧