0.简介
在计算基本是加减乘除表达式的时候,比较好的方法就是把中缀式转换到后缀式来计算,正好最近用上类似的知识了,就复习一下。
1.中缀转换后缀并计算结果实现
是说话,这类知识点书上,网上到处都有,我就不写了,直接贴代码了。
#include<vector>
#include<unordered_map>
#include<stack>
#include<functional>
using namespace std;
int main()
{
vector<float> arr;
stack<char> st;
string s = "35/5+27*3-55+1";// "1+1*1+6*2/3*2+1*2-2+2*1+1+1+1/2";
int i = 0,j = 0;
unordered_map<string, pair<int, function<void(float&, float)>>> ops =
{ {"+",{1,[](float& a,float b) {a += b; }}},
{"-",{1,[](float& a,float b) {a -= b; }}},
{"*",{2,[](float& a,float b) {a *= b; }}},
{"/",{2,[](float& a,float b) {a /= b; }}} };
while ((j = i) < s.size() || !st.empty())
{
while (s[i] >= '0' && s[i] <= '9') i++;//捕获数字
if (i > j)
arr.push_back(atof(s.substr(j, i - j).c_str()));
if (st.empty() s[i]!='\0' || (ops[string(1, s[i])].first > ops[string(1, st.top())].first))
st.push(s[i++]);//这里对符号进行处理,所有入栈情况都在这里
else//反之就是出栈情况
while (!st.empty() && !(s[i] != '\0' && ops[string(1, s[i])].first > ops[string(1, st.top())].first))//栈空了或者前一个符号优先级低就退出
{
ops[string(1, st.top())].second(arr[arr.size() - 2], arr[arr.size() - 1]);
arr.pop_back();
st.pop();
}
}
cout << arr[0] << endl;
return 0;
}
代码比较浓缩,也没用错误处理。