我已经为这个问题苦恼了一段时间,我似乎不太明白为什么在执行时,当以下函数执行时,以及 main 中的测试代码调用以查看堆栈是否为空,由于某种原因,事实并非如此。我似乎无法弄清楚确切的原因,虽然我有一种感觉,它与“删除”功能不删除最后一个节点有关,但由于某种原因,我不知道如何修复它。
TYPE listStackPop (struct Stack* stack)
{
/* FIXME: You will write this function */
assert (stack != NULL);
assert (!listQueueIsEmpty (stack->q1));
return listQueueRemoveFront (stack->q1);
}
---later calls to listQueueRemoveFront---
TYPE listQueueRemoveFront (struct Queue* queue)
{
/* FIXME: You will write this function */
assert (queue != 0);
assert (!listQueueIsEmpty (queue));
struct Link* toDelete;
toDelete = queue->head->next;
if (toDelete == queue->tail) {
queue->tail = queue->head;
}
else {
queue->head->next = toDelete->next;
}
int retVal = toDelete->value;
return retVal;
}
--For clarity, TYPE is defined as int--
我尝试从简单地返回 toDelete->value 到将 toDelete 的值复制到 int,然后传递要返回的 int,因为我认为 toDelete 可能被过早删除或其他什么原因,但事实并非如此。 不幸的是,谷歌也没有太多这方面的信息。无论如何,到目前为止。
这里是pastebin上的完整代码,如果有人有兴趣阅读全文:https://pastebin.com/cDvdHmTu
我原以为它会通过,但由于某种原因,即使所有其他测试用例都通过了,它还是失败了。
结果:
-------------------------------------------------
---- Testing stack from queue implementation ----
-------------------------------------------------
stack init...
stackIsEmpty == 1: PASSED
pushing 4, 5, -300...
stackIsEmpty == 0: PASSED
popping; val == -300: PASSED
popping; val == 5: PASSED
top val == 4 : PASSED
popping; val == 4: PASSED
stackIsEmpty == 1: FAILED
pushing 0-9...
top val == 9 : PASSED
C:\Users\Zedri\source\repos\Stack From Queues\Debug\Stack From Queues.exe (process 8928) exited with code 0.
Press any key to close this window . . .
使用的编译器/IDE:Visual Studio 2019
-~-~-~编辑1~-~-~-
删除了对 toDelete 指针的 malloc 调用
~-~-~-编辑2-~-~-~
修复了 Pastebin 上的代码。问题已解决。
最佳答案
没关系,我只需要将 queue->head->next = toDelete->next;
移到 else block 之外,并完全删除 else block 。
关于c - 弹出堆栈不起作用吗? (从两个队列入栈),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56048179/