关于逆波兰式

kiraprofile 2009-04-10 06:25:39
什么是后缀逆波兰表达式?
比如a*(b+c)-D,转换成逆波兰表达式应该是什么,看书实在是看的不明不白的,求解!!
...全文
532 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
andel2003 2010-01-07
  • 打赏
  • 举报
回复
研究一下 还不会,看书看得头疼
breezes2008 2009-04-10
  • 打赏
  • 举报
回复
假设有2个栈,栈1用于读取中缀表达式中数字,栈2用于读取中缀表达式中操作符。
那么步骤如下:
1.遇到数字a,压入栈1中。
2.遇到*号,压入栈2中。
3.遇到(号,由于(号的优先级高于栈2顶部元素*号,所以压入栈2.
4.遇到数字b,压入栈1中。
5.遇到+号,由于栈2顶部元素是(号,所以压入栈2中。
此时,栈1:ab
栈2:*(+

6.遇到数字c,压入栈1中。
7.遇到)号,栈2中元素依次出栈(依次保存到栈1中),直到遇到(号为止.
此时,栈1:abc+
栈2:*
8.遇到-号,由于-号的优先级低于栈2顶部元素,所以栈2出栈(还是保存栈1中),-号再次与栈2元素比较优先级,此时栈2已为空,无栈顶元素比较,所以此时压入-号到栈2中。
此时,栈1:abc+*
栈2:-

9.遇到数字d,压入栈1中。
10.中缀表达式扫描完毕,栈2全部出栈(还是保存栈1中).
此时,栈1:abc+*d-
栈2:空






breezes2008 2009-04-10
  • 打赏
  • 举报
回复
假设有2个栈,栈1用于读取中缀表达式中数字,栈2用于读取中缀表达式中操作符。
那么步骤如下:
1.遇到数字a,压入栈1中。
2.遇到*号,压入栈2中。
3.遇到(号,由于(号的优先级高于栈2顶部元素*号,所以压入栈2.
4.遇到数字b,压入栈1中。
5.遇到+号,由于栈2顶部元素是(号,所以压入栈2中。
此时,栈1:ab
栈2:*(+

6.遇到数字c,压入栈1中。
7.遇到)号,栈2中元素依次出栈(依次保存到栈1中),直到遇到(号为止.
此时,栈1:abc+
栈2:*
8.遇到-号,由于-号的优先级低于栈2顶部元素,所以栈2出栈(还是保存栈1中),-号再次与栈2元素比较优先级,此时栈2已为空,无栈顶元素比较,所以此时压入-号到栈2中。
此时,栈1:abc+*
栈2:-

9.遇到数字d,压入栈1中。
10.中缀表达式扫描完毕,栈2全部出栈(还是保存栈1中).
此时,栈1:abc+*d-
栈2:空






bfhtian 2009-04-10
  • 打赏
  • 举报
回复
up2楼
xqls_xqls 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hairetz 的回复:]
至于定义就不废话了,数据结构书都有,百科上也有.
http://baike.baidu.com/view/552648.htm?func=retitle

a*(b+c)-D转为后缀表达式,有个很好的做法.
先用一颗2叉树来表示该表达式.叶子节点来表示数字,其它节点表示操作符号.
-
/ \
* D
  / \
a +
/ \
b c
然后对该树做后续遍历,就是abc+*D-,这个就是后缀表达式了.
如果说后续遍历你看不出来,那就得翻翻书了.
[/Quote]

编译原理里面的.软考必考题
Waiting4you 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liliangbao 的回复:]
例子:
3 32+ 5 3* -
1.如果你拿着的是一个数,不多说,直接把它放进圆筒;

2.如果你拿着的是一个运算符号,不要把它放进去。先从圆筒里取出两个数(当然是先取最上而的啦,筒很细的),然后处这两个数作运算符号指定的运算,并把结果写在一张新的纸片上,然后放进筒里。比如你拿着的是“+”,你要依次取出“32”和“3”,让它们相加,得“35”,把“35”写在一张新纸片上(现在“34”和“12”可以扔掉了),并把这张新纸片…
[/Quote]
这个写得生动,收藏之
newborn2012 2009-04-10
  • 打赏
  • 举报
回复
逆波兰表达式用来计算算术表达式的结果很好。
S_zxing 2009-04-10
  • 打赏
  • 举报
回复
后缀表达式就是碰到运算符就取它前面的两个数字做按那个运算规则做运算。
liliangbao 2009-04-10
  • 打赏
  • 举报
回复
例子:
3 32+ 5 3* -
1.如果你拿着的是一个数,不多说,直接把它放进圆筒;

2.如果你拿着的是一个运算符号,不要把它放进去。先从圆筒里取出两个数(当然是先取最上而的啦,筒很细的),然后处这两个数作运算符号指定的运算,并把结果写在一张新的纸片上,然后放进筒里。比如你拿着的是“+”,你要依次取出“32”和“3”,让它们相加,得“35”,把“35”写在一张新纸片上(现在“34”和“12”可以扔掉了),并把这张新纸片放进圆筒。

当圆筒里只有一个数时,你就可以停下来了,我猜这个数是20,没错,这就是这个表达式的值!
liliangbao 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hairetz 的回复:]
至于定义就不废话了,数据结构书都有,百科上也有.
http://baike.baidu.com/view/552648.htm?func=retitle

a*(b+c)-D转为后缀表达式,有个很好的做法.
先用一颗2叉树来表示该表达式.叶子节点来表示数字,其它节点表示操作符号.
-
/ \
* D
  / \
a +
/ \
b c
然后对该树做后续遍历,就是abc+*D-,这个就是后缀表达式了.
如果说后续遍历你看不出来,那就得翻翻书了.
[/Quote]
Up~
  • 打赏
  • 举报
回复
晕,怎么格式出来就变了.

     -
  / \
  * D
   / \
  a +
/ \
 b c

  • 打赏
  • 举报
回复
至于定义就不废话了,数据结构书都有,百科上也有.
http://baike.baidu.com/view/552648.htm?func=retitle

a*(b+c)-D转为后缀表达式,有个很好的做法.
先用一颗2叉树来表示该表达式.叶子节点来表示数字,其它节点表示操作符号.
-
/ \
* D
  / \
a +
/ \
b c
然后对该树做后续遍历,就是abc+*D-,这个就是后缀表达式了.
如果说后续遍历你看不出来,那就得翻翻书了.
lzr4304061988012 2009-04-10
  • 打赏
  • 举报
回复
abc+*d-

65,211

社区成员

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

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