前缀表达式 如何描述 三元运算符

吹风的兔子 2013-01-11 11:41:23
前缀表达式: 一种可以将 普通的运算式 描述成 堆栈执行顺序 的表达式(特别适合计算机或者算法的理解)

比如 :
a+b ---> +,a,b 
a+(b-c) ---> +,a,-,b,c 
a+(b-c)*d ---> +,a,*,-,b,c,d 
a=1+3 ---> =,a,+,1,3

那么我想知道:
2+2>1 ? 5 : 6 这该如何 描述成 前缀表达式??
...全文
559 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
吹风的兔子 2013-01-21
  • 打赏
  • 举报
回复
引用 11 楼 caozhy 的回复:
顺便说下另外两种表达式的形式,中缀和后缀。 中缀形式很类似面向对象的表述,比如 1+1其实就是1.+(1)如果1+分别是合法的对象和函数命名的话。在C#中,你得这么表示 obj i = 1; var result = i.Add(1); 去掉括号和点就是中缀了。比如3+2*5其实就是3.+(2.*(5)) 再说后缀,后缀表达式其实是一个堆栈机,其实它是最符……
那也就是说:最合适就是 后缀表达式咯!!——应该是!
threenewbee 2013-01-20
  • 打赏
  • 举报
回复
顺便说下另外两种表达式的形式,中缀和后缀。 中缀形式很类似面向对象的表述,比如 1+1其实就是1.+(1)如果1+分别是合法的对象和函数命名的话。在C#中,你得这么表示 obj i = 1; var result = i.Add(1); 去掉括号和点就是中缀了。比如3+2*5其实就是3.+(2.*(5)) 再说后缀,后缀表达式其实是一个堆栈机,其实它是最符合计算机运行方式的表示形式 比如 1 + 1 就是1 1 + 如果你把这个看成一个堆栈的话,那么你只要看到数据就放入寄存器,看到运算符就做运算就可以了。 事实上IL语言就是一个堆栈机。
吹风的兔子 2013-01-19
  • 打赏
  • 举报
回复
测试代码:

运行结果:


————————————————————————————————————————————————
至于函数源码,我会找时间 公开;
吹风的兔子 2013-01-19
  • 打赏
  • 举报
回复
至于我为什么 要提出这个问题,有如下函数:
string value = ComputeHelper.Compute("False?111:222").Value;
string value = ComputeHelper.Compute("10-1+2-3+4-5+6").Value;
string value = ComputeHelper.Compute("\"QWERTYUIOP{}:\" LIKE \"%ERT%U%\"").Value;
string value = ComputeHelper.Compute("(\"QWERTYUIOP{}:\" LIKE \"%ERT%U\")?1111+1111:2222+2222").Value;
string value = ComputeHelper.Compute("(REPLACE(REPLACE(\"AAAAAAAAKKK\",\"K\",\"M\"),\"A\",\"B\") == \"BBBBBBBBMMM\")?\"HHHHHHHHH\":\"IIIIIIIIII\"").Value;
是的,这是一个 字符串的计算算法——这个算法我写了 一个星期,算法效率是 1-5毫秒(平均 2毫秒) —————————————————————————————————————————————— 之前,CSDN 中,有过 http://bbs.csdn.net/topics/270077624 但是,真正万能的方法 原理是:动态编译——效率为永久 200-300毫秒; —————————————————————————————————————————————— 我之所以提这个问题,就是因为: 现在的算法 采用的是 模拟人的思维,进行运算优先级,括号优先级——核心是 递归。 但是如果可以使用 前缀表达式,那么算法就可以不使用 递归——而是从前往后拆解 执行。 ——效率可能从 2毫秒,提升至 忽略不记的程度。 —————————————————————————————————————————————— 大神 caozhy 的分析如此透彻,最终我这边得到的结论是: 将算法 改编为 前缀表达式 是可行的!!
吹风的兔子 2013-01-19
  • 打赏
  • 举报
回复
引用 5 楼 caozhy 的回复:
不要把前缀运算看得多神秘 其实就是我们经常写的函数调用,去掉括号。 + 1 1 其实就是+(1, 1),如果+是一个合法的函数名,相当于Add(1, 1) 那么 2+2>1 ? 5 : 6 其实就是 IfTrueThenEqualsFirstElseSecond(GreaterThan(Add(2, 2), 1), 5, 6) 把这些函数名用符号表示(对……
看到自己的问题,百度,Google 解决不了,有时总让自己觉得飘飘然:认为自己已经走在了技术的前沿。 今天,看到大神的回复,我只想说:如此通俗易懂的解释,让我佩服得五体投地;心甘情愿的臣服于亲爱的大神的脚下!! 在这即将结贴的关头,我只想说:亲爱的大神 caozhy,我对你的美好情感有如滔滔江水,连绵不绝,有如黄河泛滥 一发不可收拾; 此时此刻,我心中的傲慢与偏见 已经当然无存,有的,只是对大神的感激与膜拜; 我无法控制自己,只想发自心底的呐喊:大神 caozhy ,我爱你!!!
ldandlg 2013-01-15
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
引用 4 楼 caozhy 的回复:
随便你,比如说你用?表示可以叫 ? > + 2 2 1 5 6
是的。
threenewbee 2013-01-14
  • 打赏
  • 举报
回复 1
不要把前缀运算看得多神秘 其实就是我们经常写的函数调用,去掉括号。 + 1 1 其实就是+(1, 1),如果+是一个合法的函数名,相当于Add(1, 1) 那么 2+2>1 ? 5 : 6 其实就是 IfTrueThenEqualsFirstElseSecond(GreaterThan(Add(2, 2), 1), 5, 6) 把这些函数名用符号表示(对于三元运算,事实上只要一个符号就可以了,我们用?,:相当于界符,不需要写了) ?(>(+(2, 2), 1), 5, 6) 最后我们不写括号了 ? > + 2 2 1 5 6 就行了。 为什么可以不写括号?因为作为运算符的函数的参数个数是确定的。 所谓二元运算,就是2个参数的函数,所谓三元运算,就是3个参数的函数。 事实上,你写程序连10元运算都用过了,那就是10个参数的函数。 看看,简单吧。
threenewbee 2013-01-14
  • 打赏
  • 举报
回复
随便你,比如说你用?表示可以叫 ? > + 2 2 1 5 6
吹风的兔子 2013-01-14
  • 打赏
  • 举报
回复
和每次都一样, 我的问题 从来都没有被正面的解决过.... ——搞得我都不想再提问了....
吹风的兔子 2013-01-11
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
这是三元运算,你只需要将 2+2>1 描述即可,后面那个是条件判断
——就是说,前缀表达式 不能连贯的 表述 三元运算符,中间得加一个 人为的判断咯??
bdmh 2013-01-11
  • 打赏
  • 举报
回复
这是三元运算,你只需要将 2+2>1 描述即可,后面那个是条件判断

1,979

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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