[演算法] 逆波蘭表示式(棧實現)
阿新 • • 發佈:2019-01-02
問題
- 計算給定的逆波蘭表示式的值,有效操作只有,每個運算元都是整數;
- 例如:
- ”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;
}