亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問板塊 發(fā)新帖
查看: 2346 | 回復(fù): 4
打印 上一主題 下一主題

優(yōu)先級(jí)和結(jié)合性的算法 [復(fù)制鏈接]

求職 : 軟件工程師
論壇徽章:
3
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-07 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-13 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-05-05 06:20:00
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2016-10-15 19:55 |只看該作者 |倒序?yàn)g覽
30可用積分
我以前感覺這個(gè)算法沒什么用,現(xiàn)在想來(lái),這個(gè)算法在語(yǔ)法樹分析中,是非常必要的一種算法:

有若干個(gè)操作符,例如 +,  *, ^, 這三個(gè)操作符的優(yōu)先級(jí)不同,結(jié)合性也不同,^ 是左結(jié)合的,而 +, * 則是右結(jié)合,當(dāng)然左結(jié)合也行,F(xiàn)在懸賞算法,如果采納的話,贈(zèng)送 5000 積分,如果算法優(yōu)秀,我相信會(huì)有人打賞的。


  1. a + b * c ^ d => (a + (b * (c ^ d))
復(fù)制代碼


最佳答案

查看完整內(nèi)容

my brick.plop:1+2+3+4+5 =>((((1 + 2) + 3) + 4) + 5)----------------------------------------------------------------1*2*3*4 * 5 + 6-7 /8 =>((((((1 * 2) * 3) * 4) * 5) + 6) - (7 / )----------------------------------------------------------------1^2~3*4-5 =>(((1 ^ (2 ~ 3)) * 4) - 5)----------------------------------------------------------------1/2/3/4/5*6*7^8^9-10-11*12 =>((((((((1 / 2) / 3) / 4 ...

論壇徽章:
7
戌狗
日期:2013-12-15 20:43:38技術(shù)圖書徽章
日期:2014-03-05 01:33:12技術(shù)圖書徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16賽季CBA聯(lián)賽之青島
日期:2016-03-17 20:36:13
2 [報(bào)告]
發(fā)表于 2016-10-15 19:55 |只看該作者
my brick.pl

  1. #/usr/bin/perl
  2. use 5.024;

  3. my @op = qw[ + - * / ^ ~ ];
  4. my @preass = ( [ 0, 0 ], [ 0, 0 ], [ 1, 0 ], [ 1, 0 ], [ 2, 1 ], [ 3, 1 ] );
  5. my ( @it, @ass );
  6. sub that;

  7. for my $i ( 0 .. $#op ) {
  8.     $it[ $preass[$i][0] ] .= "\\$op[$i]";
  9.     $ass[ $preass[$i][0] ] //= $preass[$i][1];
  10. }

  11. @it = map qr/\s*([$_])\s*/, @it;

  12. sub that {
  13.     my ( $equ, $i ) = @_;
  14.     return @$equ if $i > $#it;
  15.    
  16.     state $at   = [ 0, -3 ];
  17.     state $join = [ [ 0 .. 2 ], [ -3 .. -1 ] ];
  18.     local $|    = 1;
  19.    
  20.     my @one = map $|-- ? that [ split $it[$i] ], $i + 1 : $_, @$equ;
  21.     my $ass = $ass[ $i - 1 ];
  22.     my $pos = $at->[$ass];
  23.     my $dit = $join->[$ass];

  24.     splice @one, $pos, 3, "(@one[@$dit])" until @one == 1;
  25.     @one;
  26. }

  27. sub this { that [shift], 0 }

  28. while (<DATA>) {
  29.     chomp;
  30.     say $_, ' =>';
  31.     say this $_;
  32.     say '-' x 64;
  33. }

  34. __DATA__
  35. 1+2+3+4+5
  36. 1*2*3*4 * 5 + 6-7   /8
  37. 1^2~3*4-5
  38. 1/2/3/4/5*6*7^8^9-10-11*12
  39. a + b * c ^ d + e - f * g / h ^ i ~ j
  40. 3 ^ 4 ^ 5 ^ 6 - 7 / 8 + 9 ^ 10 ^ 11 * 12
  41. 1 + 2 + 3 - 4 - 5 * 6 * 7 / 8 / 9 ^ 10 ^ 11 ~ 12 ~ 13 - 14
  42. 1 - 2 ^ 3 ^ 4 + 5 * 6 / 7
復(fù)制代碼

op:
1+2+3+4+5 =>
((((1 + 2) + 3) + 4) + 5)
----------------------------------------------------------------
1*2*3*4 * 5 + 6-7   /8 =>
((((((1 * 2) * 3) * 4) * 5) + 6) - (7 / )
----------------------------------------------------------------
1^2~3*4-5 =>
(((1 ^ (2 ~ 3)) * 4) - 5)
----------------------------------------------------------------
1/2/3/4/5*6*7^8^9-10-11*12 =>
((((((((1 / 2) / 3) / 4) / 5) * 6) * (7 ^ (8 ^ 9))) - 10) - (11 * 12))
----------------------------------------------------------------
a + b * c ^ d + e - f * g / h ^ i ~ j =>
(((a + (b * (c ^ d))) + e) - ((f * g) / (h ^ (i ~ j))))
----------------------------------------------------------------
3 ^ 4 ^ 5 ^ 6 - 7 / 8 + 9 ^ 10 ^ 11 * 12 =>
(((3 ^ (4 ^ (5 ^ 6))) - (7 / ) + ((9 ^ (10 ^ 11)) * 12))
----------------------------------------------------------------
1 + 2 + 3 - 4 - 5 * 6 * 7 / 8 / 9 ^ 10 ^ 11 ~ 12 ~ 13 - 14 =>
(((((1 + 2) + 3) - 4) - ((((5 * 6) * 7) / / (9 ^ (10 ^ (11 ~ (12 ~ 13)))))) - 14)
----------------------------------------------------------------
1 - 2 ^ 3 ^ 4 + 5 * 6 / 7 =>
((1 - (2 ^ (3 ^ 4))) + ((5 * 6) / 7))
----------------------------------------------------------------

評(píng)分

參與人數(shù) 2信譽(yù)積分 +20 收起 理由
sunzhiguolu + 10 學(xué)習(xí), 膜拜!!!
hztj2005 + 10 很給力!

查看全部評(píng)分

論壇徽章:
307
程序設(shè)計(jì)版塊每周發(fā)帖之星
日期:2016-04-08 00:41:33操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-09-02 06:20:00每日論壇發(fā)貼之星
日期:2015-09-02 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-04 06:20:00每日論壇發(fā)貼之星
日期:2015-09-04 06:20:00每周論壇發(fā)貼之星
日期:2015-09-06 22:22:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-09 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-19 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-20 06:20:00每日論壇發(fā)貼之星
日期:2015-09-20 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-22 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-24 06:20:00
3 [報(bào)告]
發(fā)表于 2016-10-16 01:31 |只看該作者
不懂, 幫頂

求職 : 軟件工程師
論壇徽章:
3
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-07 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-13 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-05-05 06:20:00
4 [報(bào)告]
發(fā)表于 2016-10-16 03:38 |只看該作者
看樣要拋磚引玉了。

這是一個(gè)利用模塊的實(shí)現(xiàn):

https://github.com/ingydotnet/pe ... ial/Calculator.swim

  1. Consider the equation:

  2.   1 - 2 ^ 3 ^ 4 + 5 * 6 / 7

  3. Normal precedence and associativity rules make this the same as:

  4.   (1 - (2 ^ (3 ^ 4)) + ((5 * 6) / 7))
復(fù)制代碼
  1. {
  2.       package Calculator;
  3.       use base 'Pegex::Tree', 'Precedence';

  4.       my $operator_precedence_table = {
  5.           '+' => {p => 1, a => 'l'},
  6.           '-' => {p => 1, a => 'l'},
  7.           '*' => {p => 2, a => 'l'},
  8.           '/' => {p => 2, a => 'l'},
  9.           '^' => {p => 3, a => 'r'},
  10.       };

  11.       sub got_expr {
  12.           my ($self, $expr) = @_;
  13.           $self->precedence_rpn($expr, $operator_precedence_table);
  14.       }
  15.   }
復(fù)制代碼

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2016-10-16 20:10 |只看該作者
前幾年看過(guò)龍書的大部分內(nèi)容,但很久不用,印象就模糊了。

如果樓主懂c,可以看Kenneth C.Louden 《編譯原理及實(shí)踐》,此書有一個(gè)C語(yǔ)言實(shí)現(xiàn)的完整代碼,看懂之后改寫成Perl,是比較可行的方法。

要想完全獨(dú)立用perl的實(shí)現(xiàn),即使這么簡(jiǎn)單的問題,可能要折騰好幾天乃至更久的時(shí)間。

可以分解問題,先不考慮結(jié)合性,只考慮優(yōu)先級(jí)。

實(shí)現(xiàn)中,有這種問題: 4+6^(3+2)-5,就是操作數(shù)不是一個(gè)單純的數(shù)字,而是一個(gè)表達(dá)式(3+2),需要遞歸實(shí)現(xiàn)。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP