1. 程式人生 > >【演算法】使用棧計算簡單的字尾表示式

【演算法】使用棧計算簡單的字尾表示式

計算字尾表示式

計算簡單的字尾表示式,形如:“231*+9-”
主要還是利用了棧的特性,先入後出。計算的簡略步驟如下:

  1. 第一個元素是2,將其入棧。此時棧元素為2
  2. 遇到3,將其入棧。此時棧元素為23
  3. 遇到1,將其入棧。此時棧元素為231
  4. 遇到操作,彈出2個數字進行乘法操作(先出1,後出3,計算方式為31),將結果3入棧。此時棧元素為23
  5. 遇到+操作,彈出2個數字進行乘法操作(先出3,後出2,計算方式為2+3),將結果5入棧。此時棧元素為5
  6. 遇到9,將其入棧。此時棧元素為59
  7. 遇到-操作,彈出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。