AcWing 151 棧 中綴表示式

2021-10-18 16:22:44 字數 1625 閱讀 3125

題意

傳送門 acwing 151 表示式計算4

題解由於表示式可能會出現多餘括號的情況,使用棧預處理出正確的表示式。具體而言,從左向右掃瞄表示式,統計括號數量,除了多餘的右括號,其餘元素入棧;將元素出棧,除了多餘的左括號,其餘元素放入表示式。

遞迴求解中綴表示式,考慮到括號內表示式優先計算,統計未被包含在括號內的運算子,按照表示式從左往右進行以及運算子的優先順序(冪》乘除》加減),選取優先順序最低且最靠表示式右邊的運算子,以其劃分表示式為左右兩半遞迴,結果盡心對應運算;若沒有這樣的運算子,若表示式本身收尾字元為括號,遞迴求解括號內表示式,否則,對應表示式為數字。

#include

using

namespace std;

const

int maxn =

1005

;char s[maxn]

;stack<

char

> st;

intqpow

(int x,

int n)

return res;

}int

digit

(int l,

int r)

return x * f;

}int

solve

(int l,

int r)

if(op1 !=-1

)return s[op1]

=='+'

?solve

(l, op1)

+solve

(op1 +

1, r)

:solve

(l, op1)

-solve

(op1 +

1, r);if

(op2 !=-1

)return s[op2]

=='*'

?solve

(l, op2)

*solve

(op2 +

1, r)

:solve

(l, op2)

/solve

(op2 +

1, r);if

(op3 !=-1

)return

qpow

(solve

(l, op3)

,solve

(op3 +

1, r));

if(s[l]

=='('

&& s[r -1]

==')'

)return

solve

(l +

1, r -1)

;return

digit

(l, r);}

intmain()

st.push

(c);

} n =

0, cnt =0;

while

(st.

size()

) s[n++

]= c;

}reverse

(s, s + n)

;printf

("%d\n"

,solve(0

, n));

return0;

}

棧 中綴 字尾表示式

利用棧計算字尾表示式 include include include using namespace std int main s.push num i cout i else if str i str i str i str i s.push res cout result 0 利用棧,把中綴表示...

棧求解中綴表示式

表示式求值是進行資料處理的最基本操作。請編寫程式完成乙個簡單算術表示式的求值。要求如下 1 運算子包括 乘方 括號 2 運算量為數值常量,根據自己的能力可以對運算量做不同的約束,例如1位整數 多位整數 實數等 會有不同的測試用例 輸入 一行,即表示式,以 結束。例如 5 8 3 6 5 輸出 一行,...

中綴表示式轉為字尾表示式 棧

題目 給乙個中綴表示式 即標準形式的表示式 列印該表示式的字尾表示式。中綴表示式最大的不同就是去掉了表示運算子優先順序的括號。運算元為26個小寫或大寫的英文本母 注意不包括數字和其他字元 操作符為 一共八個。具體見例子見下圖 如下 include include include using name...