作者tabinoyume (旅之夢)
看板C_and_CPP
標題Re: [問題] 一開始就要輸入"算式" 像1+2*3 然後輸出7
時間Sat Oct 9 15:58:54 2010
※ 引述《calqlus (東方一隻鹿)》之銘言:
: ( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 )
: ( 未必需要依照此格式,文章條理清楚即可 )
: 遇到的問題: (題意請描述清楚)
: 題目有些英文看不懂
: 所以先直接原題目po網址
: http://0rz.tw/b0zBf
: 大概了解
: 會出現的運算符號有 四則運算和 表示負號的- 以及括號() 取餘數%
: 看到這題目的印象
: 就是用C++的operator
: 不過很快就發現 那些符號是要強制輸入的-.-
: 於是想到第二個 用堆疊
: 不過問題就在這了吧
: 是要怎麼樣把 像一次輸入的 789-(400+300) 好好的拆開
: 也許要先宣告字串先放再拆
: 不過我會用到strpbrk()那個函式...最近老是用它也蠻煩的
: 所以想問
: 有沒有更快 或 比較不用用到奇怪的函式的方法
: 感謝
提供一個想法,有錯請指正
用遞洄方式建一個類似下面的樹
分割順序是將四則運算的規則反過來,
'-'是減號還是負號就自己在多加點判斷
EX:(A+B)*C+D
(A+B)*C+D
/ ∣ \
(A+B)*C + D
/ ∣ \
(A+B) * C
/ ∣ \
( A+B )
/∣\
A + B
建完之後再從葉節點把值計算完後傳回上層
(這裡就知道為何分割順序與四則運算的規則相反)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.123.87.131
推 LPH66:這其實就是個簡單的 recursive descendant parser 啊 XD 10/09 20:58
推 yauhh:不需要樹狀分割.這裡要用到分割只是要把二個以上的數字視為 10/09 21:57
→ yauhh:同一個數,只要按()+-*/任意順序分割再整理到陣列中即可. 10/09 21:59
→ yauhh:不過,遞迴處理是一定要的. 10/09 21:59
樹只是一種方便說明的概念 實做方式隨人
※ 編輯: tabinoyume 來自: 122.123.84.161 (10/09 22:06)
→ yauhh:嗯,沒錯,不管任何順序分割,都是樹. 10/09 23:12