這篇部落格講的超級好
//原理就是中綴表示式我們需要先轉字尾表示式, 然後就可以求了.
int
calculate
(string s)
-- i;
hou.
push_back
(to_string
(tmp));
}else
if(s[i]
=='('
) st.
push
(s[i]);
else
if(s[i]
==')'
) st.
pop();
}else
st.push
(s[i]);
}}}while
(!st.
empty()
) stack<
double
>
num;
// 下面是求值過程
for(
int i =
0; i < hou.
size()
;++ i)
else num.
push
(stod
(hou[i]))
;}return num.
top();
}double
cal(
double x,
double y, string op)
// 下面的稍顯複雜, 不過先留著mark
下面附上**實現:
###1:中綴表示式轉字尾表示式code
const
int maxn =
1e3+5;
char zhong[maxn]
;char hou[maxn]
;stack<
char
>
s;void
solve()
}else
if(zhong[i]
=='*'
|| zhong[i]
=='/'
) s.
push
(zhong[i]);
}else
if(zhong[i]
=='+'
|| zhong[i]
=='-'
) s.
push
(zhong[i]);
}}}while
(!s.
empty()
) hou[cnt]=0
;printf
("%s\n"
,hou)
;}
模板題
###2 : 四則運算表示式求值(有了以上的基礎,這個就比較簡單)
code
const
int maxn =
1e3+5;
char zhong[maxn]
;char hou[maxn]
;char num[maxn]
;db res[maxn]
;stack<
char
>
s;stack
cal;
void
solve()
i--; res[cnt++]=
atof
(num);}
else
}else
if(zhong[i]
=='*'
|| zhong[i]
=='/'
) s.
push
(zhong[i]);
}else
if(zhong[i]
=='+'
|| zhong[i]
=='-'
) s.
push
(zhong[i]);
}}}while
(!s.
empty()
)for
(int i=
0;iprintf
("%.2f\n"
,cal.
top())
; cal.
pop();
}}
中綴 字首 字尾表示式 相互轉換
1.中綴表示式 便於人看 2.字首表示式 波蘭式 運算子在前面,運算數在後面 3.字尾表示式 逆波蘭式 運算數在前面,運算子在後面 中綴 字首 優先順序先乘除再加減,入棧方向從右往左,棧外的符號想進棧,棧內的符號想出棧。棧外左括號不能進棧,棧外右括號優先順序最高。棧內右括號優先順序最低。中綴 字尾 ...
四則運算的中綴表示式和字尾表示式
中綴表示式 就是運算符號在數字中間的表達方式。字尾表示式 運算符號在數字的後面出現。1 中綴表示式向字尾表示式的轉換方法 規則 從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分 若是符號,就判斷當前符號與棧頂符號的優先順序,如果是右括號或者是優先順序低於棧頂符號 乘除...
中綴 字尾表示式 四則運算
中綴表示式轉化為字尾表示式,並通過字尾表示式計算值 轉化規則 出棧 出棧後元素新增到字尾表示式的末尾 中綴表示式掃瞄完畢後,若棧內元素不為空,依次出棧直到棧為空,出棧元素新增到字尾表示式後 舉例 3 2 5 4 2 過程如下 建立操作符棧,以及儲存字尾表示式的佇列 從頭到尾掃瞄中綴表示式,首先掃瞄到...