1. 程式人生 > >[演算法] 逆波蘭表示式(棧實現)

[演算法] 逆波蘭表示式(棧實現)

問題

  • 計算給定的逆波蘭表示式的值,有效操作只有+/,每個運算元都是整數;
  • 例如:
    • ”2”, “1”, “+”, “3”, “*” : 9,(2+1)*3
    • “4”, “13”, “5”, “/”, “+” : 6,4+(13/5)

分析

  • 對於逆波蘭表示式abc-d*;
  • 若當前字元是運算元,則壓棧;
  • 若當前字元是操作符,則彈出棧中的兩個運算元,計算後仍然壓入棧中:
    • 若某次操作,棧中無法彈出兩個運算元,則表示式有誤

程式碼實現

程式碼實現如ReversePolishNotation.hpp所示:

#ifndef ReversePolishNotation_hpp
#define ReversePolishNotation_hpp
#include <stdio.h> // 判斷給定字串是否為操作符 bool isOperator(const char* token) { return ((token[0] == '+') || (token[0] == '-') || (token[0] == '*') || (token[0] == '/')); } // 計算逆波蘭表示式的值 int computeReversePolishNotation(const char* str[], int size) { std::stack<int> s; int a, b; const
char* token; for (int i = 0; i < size; i++) { token = str[i]; if (!isOperator(token)) { s.push(atoi(token)); } else { b = s.top(); s.pop(); a = s.top(); s.pop(); if (token[0] == '+') { s.push(a+b); } else
if(token[0] == '-') { s.push(a-b); } else if(token[0] == '*') { s.push(a*b); } else if(token[0] == '/') { s.push(a/b); } } } return s.top(); } #endif /* ReversePolishNotation_hpp */

測試程式碼main.cpp:

#include "ReversePolishNotation.hpp"

int main(int argc, const char * argv[]) {
    const char* str[] = {"2", "1", "+", "3", "*"};
    int value = computeReversePolishNotation(str, 5);
    printf("%d\n", value);
    return 0;
}