我一直在尝试获取已从infix转换而来的后缀字符串,并对其求值以显示其正确值。这是我解析后缀字符串并将数字放入堆栈(int值的postStack)的方法:
int evaluate(int num1, char token, int num2)
{
int result = 0;
switch (token)
{
case '+': result = num1 + num2;
case '-': result = num1 - num2;
case '*': result = num1 * num2;
case '^': result = (int)(pow(num1, num2) + 0.5);
}
return result;
}
这是同时接收数字和运算符的评估方法:
1: 2 + 3 * 5
235*+
-2147483648
2: 2 + 3 * 5 ^ 6
2356^*+
0
3: 2 + 3 - 5 + 6 - 4 + 2 - 1
23+5-6+4-2+1-
-2147483647
4: 2 + 3 * (5 - 6) - 4
2356-*+4-
0
5: 2 * 3 ^ 5 * 6 - 4
235^*6*4-
-2147483648
6: (2 + 3) * 6 ^ 2
23+62^*
-2147483648
当打印为大的负数或零时,我一直从中接收到的输出。我在这里想念什么? 输出:
while (!postStack.empty())
{
int itemp = postStack.top(); postStack.pop();
cout << itemp;
}
cout << endl << endl;
这是我用来打印堆栈的内容:
<my-component *ngIf="yet" [templatesRef]="cellTemplates"></my-component>
答案 0 :(得分:3)
您的switch
在每个break
之后缺少case
。它落入谷底,并执行除第一个匹配的条件之外的所有case语句。最终,这意味着您总是在计算num1
对num2
的功效。这使您无法容纳int的荒谬高数字,并且您溢出,因此int变为负数。
例如,输入“ 235 * +”实际上计算出2 ^(3 ^ 5)= 2 ^243。但是int最多只能保存2 ^ 31-1的值。
答案 1 :(得分:1)
您在每个break
块中都缺少case
语句。
#include <bits/stdc++.h>
using namespace std;
int evaluate(int num1, char token, int num2){
int result = 0;
switch (token){
case '+': result = num1 + num2; break;
case '-': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case '^': result = (int)(pow(num1, num2) + 0.5); break;
}
return result;
}
int main(){
string post = "2356^*+";
stack<int> postStack;
for (int i = 0; i < post.length(); i++){
int result;
if (isdigit(post[i])){
int j = post[i] - '0';
postStack.push(j);
}
else{
char token = post[i]; //token = char type;
int num2 = postStack.top(); postStack.pop();
int num1 = postStack.top(); postStack.pop();
result = evaluate(num1, token, num2);
postStack.push(result);
}
}
cout << postStack.top() <<endl;
}