当堆栈仍然有元素时,为啥会跳过“如果堆栈不为空”条件?

Posted

技术标签:

【中文标题】当堆栈仍然有元素时,为啥会跳过“如果堆栈不为空”条件?【英文标题】:Why does skips the "if stack not empty" conditional, when the stack still has elements?当堆栈仍然有元素时,为什么会跳过“如果堆栈不为空”条件? 【发布时间】:2014-08-29 06:47:42 【问题描述】:

我正在尝试编写一个程序来解决八皇后问题,但是它一直到达最后一个返回,而它不应该,并尝试将它放在一个 else 上,但它从未到达它,即使我最初也是如此给它一个空堆栈。 同样无论出于何种原因,我第一次调用 top() 函数时,它返回的元素与我上次添加的元素不同,但如果我再次调用它,它会返回正确的元素。 所以我想知道问题出在哪里?

bool search(stack<nodo>& board, int n) 
    nodo queen;
    queen=board.top();
    queen=board.top();
    if (queen.y == n)
        return true;

    bool valid;
    if (!board.empty()) 
        queen.y += 1;
        for(int i; i<=n; i++) 
            queen.x = i;
            valid = isvalid(queen,board);
            if (valid) 
                board.push(queen);
                search(board,n);
            
        
        board.pop();
    

    return false;

【问题讨论】:

您的意思可能是return search(board, n); 而不是search(board, n); 【参考方案1】:

使用while 而不是if

while(!board.empty()) 

    queen.y += 1;
    for(int i; i<=n; i++)
        queen.x = i;
        valid = isvalid(queen,board);

        if (valid) 

            board.push(queen);
            search(board,n);
        

    

    board.pop();

if 表示只检查一次,但while 表示做同样的事情直到board.empty() == true

【讨论】:

好的,我知道问题出在哪里了,显然我要改变一些东西,谢谢。

以上是关于当堆栈仍然有元素时,为啥会跳过“如果堆栈不为空”条件?的主要内容,如果未能解决你的问题,请参考以下文章

如果没有空格分隔符,为啥 XmlReader 会跳过所有其他元素?

C-为啥Struct数组的冒泡排序会跳过Array中的第一个元素?

为啥我的时间 UILabel 从暂停状态恢复播放时会跳过 2 秒?

为啥 Visual Studio 在调试时会跳过我的方法?

如何确定为啥 Visual Studio 在构建解决方案时可能会跳过项目

为啥 JFR 会跳过事件字段