【演算法】使用棧計算簡單的字尾表示式
阿新 • • 發佈:2019-01-09
計算字尾表示式
計算簡單的字尾表示式,形如:“231*+9-”
主要還是利用了棧的特性,先入後出。計算的簡略步驟如下:
- 第一個元素是2,將其入棧。此時棧元素為2
- 遇到3,將其入棧。此時棧元素為23
- 遇到1,將其入棧。此時棧元素為231
- 遇到操作,彈出2個數字進行乘法操作(先出1,後出3,計算方式為31),將結果3入棧。此時棧元素為23
- 遇到+操作,彈出2個數字進行乘法操作(先出3,後出2,計算方式為2+3),將結果5入棧。此時棧元素為5
- 遇到9,將其入棧。此時棧元素為59
- 遇到-操作,彈出2個數字進行乘法操作(先出9,後出5,計算方式為5-9),將結果-4入棧。此時棧空了。最終結果為-4。
詳細演算法步驟如下(使用了C++自帶的棧,固定了簡單的數字0-9的對映):
//操作型別
using FuncType = std::function<int(int, int)>;
FuncType fadd = [](int a, int b) {return a + b; };
FuncType fsub = [](int a, int b) {return a - b; };
FuncType fmul = [](int a, int b) {return a * b; };
FuncType fdiv = [](int a, int b) {return a / b; };
//操作型別和操作符的對映
unordered_map<string, FuncType> funcMap{
{ "+", fadd },
{ "-", fsub },
{ "*", fmul },
{ "/", fdiv },
};
//數字型別和字串型別對映
unordered_map<string, int> numMap{
{ "0", 0 },
{ "1", 1 },
{ "2", 2 },
{ "3", 3 },
{ "4", 4 },
{ "5", 5 },
{ "6", 6 },
{ "7", 7 },
{ "8", 8 },
{ "9", 9 },
};
//一個棧
stack<string> stk;
//檢查某一元素是否為數字
bool isInteger(string value)
{
return numMap.find(value) != numMap.end();
}
//執行字尾表示式
int evaluatePostfix(string exp)
{
int result = 0;
for (int i = 0; i < exp.size(); ++i)
{
string s = exp.substr(i, 1); //獲取i的字串
if (isInteger(s))
{
stk.push(s); //數字入棧
}
else
{
int a = numMap[stk.top()]; //取出棧頂2個元素
stk.pop();
int b = numMap[stk.top()];
stk.pop();
result = funcMap[s](b, a); //通過操作符計算結果
stk.push(to_string(result));//結果入棧
}
}
return result;
}
int main()
{
string exp = "231*+9-";
cout << "result:" << evaluatePostfix(exp) << endl;
getchar();
return 0;
}
計算結果當然為-4。