如何正确显示此堆栈的内容?

How can I properly display the contents of this stack?

本文关键字:堆栈 何正确 显示      更新时间:2023-10-16

我一直在尝试获取已经从中缀转换的后缀字符串并对其进行评估以显示其正确的值。这是我解析后缀字符串并将数字放入堆栈(int 值的 postStack (的方法:

for (int i = 0; i < post.length(); i++)
{
int result;
if (isdigit(post[i]))
{
int j = post[i] - '0';
postStack.push(j);
continue;
}
else
{
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);
continue;
}
}

这是接收数字和运算符的赋值方法:

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;

您的switch在每次case后都缺少一个break。它陷入低谷并执行超出第一个匹配的 case 语句的每个 case 语句。意思是说到底你总是在计算num1的力量来num2。这给了你荒谬的高数字,不适合一个 int 并且你得到溢出,因此 int 变成负数。

例如,输入"235*+"实际上计算2 ^ (3 ^ 5( = 2 ^ 243。但是 int 最多只能保存 2 ^ 31 - 1 的值。

您在case块中的每个块中都缺少break语句。

#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;
}