1

我的代码有问题,导致运行时错误。为了调试我在一些 cout 语句中抛出的代码,以找到代码正确执行的最后一个位置。根据输出,当 while 条件评估为 false 时,while 语句似乎中断,但我看不出这是怎么可能的。这是代码:

变量声明:

queue<string> newOrder;
stack< vector<char> > opStack;
char symbol;

发生填充堆栈和队列的事情,然后到达此代码:

while(opStack.empty()==false){
    if(opStack.top()[1] != 'L'){
        cout<<"is stack empty?:"<<opStack.empty()<<endl;
        symbol = opStack.top()[0];
        newOrder.push(symbol);
        opStack.pop();
        cout<<"popped stack;"<<endl;
        cout<<"is stack empty?:"<<opStack.empty()<<endl;
    }
    else{
        break;
    }
}
cout<<"made it out of while loop";

if(opStack.top()[1] == 'L'){    
   opStack.pop();
}
else{
   errorEncountered = true;
}

这是输出:

is stack empty?:0
popped stack;
is stack empty?:1
RUN FAILED (exit value 1, total time: 1s)

因此,根据输出,堆栈在循环结束时为空。这应该使 while 循环条件为假,但程序在 while 循环退出之前失败。这怎么可能?它与堆栈的工作方式有关吗?

4

1 回答 1

3

while 循环在错误条件下退出。我没有正确调试,这使我专注于代码的错误部分。

问题实际上是在最后一次 cout 之后发生的事情。之后的语句if(opStack.top()[1] == 'L'){, 尝试从空堆栈中获取顶部项目并导致运行失败。

但这怎么可能,因为我们从来没有在输出中看到“使其脱离 while 循环”?这是因为在程序崩溃之前最后一个 cout 从未刷新到输出。我添加<<endl到最后一个 cout,就成功了。显示“使其脱离 while 循环”,我能够查明程序中的真正问题。(通过将最后一个 if-else 语句放入其中来解决if(opStack.empty()==false){//second if-else set}

感谢@interjay 指出 cout 在我原来的但格式不正确的问题中没有被刷新:c++ while loop condition is not play nice with stack.empty( )

于 2012-11-01T21:05:06.207 回答