后缀表达式求值
基本思想:
? 建立一个操作数栈S。然后从左到右读表达式,如果读到操作数就将它压入栈S中,如果读到n元运算符(即需要参数个数为n的运算符)则取出由栈顶向下的n项操作数进行运算,再将运算的结果代替原栈顶的n项压入栈中。重复上面过程,如果后缀表达式读完且栈中只剩一个操作数,则该数就是运算结果;如果后缀表达式读完但是栈中操作数多于一个,则后缀表达式错误;如果栈中操作数只剩一个,但是后缀表达式还未读完且当前运算符为双元操作符,则后缀表达式同样错误。
测试样例:5 2 + 3 *
代码实现:
int calculate(int x,int y,char ch){
switch(ch){
case '+': return x + y;
case '-': return x - y;
case '*': return x * y;
case '/':
if(y == 0){
cout << "Error: " << x << "/0" << endl;
exit(0);
}
return x / y;
}
}
bool CalcSuffixExpression(char arr[],int &res){
stack<int> stack;
for (int i = 0; i < strlen(arr); ++i) {
if (arr[i] >= '0' && arr[i] <= '9'){
stack.push(arr[i] - '0');
} else{
int num_1,num_2,temp;
num_2 = stack.top();
stack.pop();
num_1 = stack.top();
stack.pop();
temp = calculate(num_1,num_2,arr[i]);
stack.push(temp);
}
}
res = stack.top();
return true;
}
|