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

时间:2019-10-08 08:13:23

标签: c++

我一直在尝试获取已从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>

2 个答案:

答案 0 :(得分:3)

您的switch在每个break之后缺少case。它落入谷底,并执行除第一个匹配的条件之外的所有case语句。最终,这意味着您总是在计算num1num2的功效。这使您无法容纳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;
}