題意
傳送門 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...