我的代码使用strchr有什么问题

时间:2019-10-23 04:57:51

标签: c++

我想处理字符(运算符)来运算一些数字。但关键是角色来自堆栈。当我声明Char类型的堆栈并通过使用top()方法获取character(operator)时,它在strchr函数中不起作用。我不知道为什么。我真的想知道如何解决它,怎么了?

这是在C ++编程中。

这是我的主要代码

int main() {
    string c;

    stack<char> postfix_expression;


    double result = 0;

    postfix_expression.push('+');
    postfix_expression.push('1');
    postfix_expression.push('3');


    result = read_and_evaluate(postfix_expression);

    cout << result << endl;

    return 0;
}

这是我的read_and_evaluate函数。

double read_and_evaluate(stack<char>& arithmetic_expression ){

    stack<double> numbers;
    for(int i =0; i < arithmetic_expression.size() ; ++i){
        char c = arithmetic_expression.top();
        if (isdigit(c)){
            numbers.push((double)c - 48);
            cout << (int)c - 48 << endl;
        }else if(strchr("+-*/", c) != NULL){
            evaluate_stack(numbers, c);
            cout << c << endl;
            cout << numbers.top() << endl;
        }
        arithmetic_expression.pop();
    }
    return numbers.top();
}

这是Evaluation_stack函数

void evaluate_stack(stack<double>& operands, char operators) {
    double operand2 = operands.top();
    operands.pop();
    double operand1 = operands.top();
    operands.pop();

    switch(operators) {
        case '+':
            operands.push(operand1 + operand2);
        case '-':
            operands.push(operand1 - operand2);
        case '*':
            operands.push(operand1 * operand2);
        case '/':
            if (operand2 != 0.0)
                operands.push(operand1 / operand2);
            else {
                cout << "Error!: divide by zero\n";
                break;
            }
        default:
            break;
    }
    cout << operands.top() << endl;
}

关于后缀表达。我想得到3 1 + 4的结果。 但是它只显示3 1 1.。

1 个答案:

答案 0 :(得分:0)

抬起头来

for(int i =0; i < arithmetic_expression.size() ; ++i){

    ...

    arithmetic_expression.pop();
}

在逻辑上不正确。当您弹出堆栈顶部时,堆栈大小将减小1。通过增加i并将其与堆栈大小进行比较,您最终将忽略堆栈的一半。您可以使用以下方法解决此问题:

// There is no need for i
for ( ; arithmetic_expression.size() > 0; arithmetic_expression.pop()) {

   ...

}