- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在不使用数组的情况下递归地实现 LIFO 堆栈。该程序接受字符串和整数作为输入,并有一些命令——即 push <int>
pop
empty
top
和quit
。
除了 pop
之外的所有内容对我来说效果很好,并且 pop
仅部分起作用。如果你只弹出一个整数,那没问题,但除此之外,它会返回一个 stack is empty
尽管事实并非如此。我明白为什么会发生这种情况,但我不知道如何解决它。
int stack(int top, int last) {
int m = read_symbol();
if (m != READ_FAIL) {
if (m == PUSH_SYMBOL) {
int n = read_int();
top = stack(n, top);
} else if (m == POP_SYMBOL) {
if (top == INT_MIN) {
printf("pop error - stack is empty\n");
top = stack(INT_MIN, INT_MIN);
} else {
top = stack(last, INT_MIN);
}
} else if (m == TOP_SYMBOL) {
if (top == INT_MIN) {
printf("top error - stack is empty\n");
} else {
printf("top - %d\n", top);
}
top = stack(top, last);
} else if (m == EMPTY_SYMBOL) {
if (top == INT_MIN) {
printf("stack is empty\n");
} else {
printf("stack is not empty\n");
}
top = stack(top, last);
} else if (m == QUIT_SYMBOL) {
if (top != INT_MIN) {
printf("quit error - stack is not empty\n");
top = stack(top, last);
} else {
printf("goodbye\n");
}
}
}
return top;
}
top
变量是递归返回的,所以一切正常。但是当我做类似的事情
push 1
push 2
push 3
top
pop
top
pop
top
返回的输出是
top - 3
top - 2
top error - stack is empty (SHOULD BE 1)
我尝试了各种不同的方法,但没能解决它。事实上我介绍了last
参数只是为了尝试解决这个问题,即使没有 last
,其余的实现也可以正常工作。但这个参数目前似乎有效,但仅适用于一个 pop
命令,因为下一个递归级别设置 last
至INT_MIN
然后设置为 top
如果你pop
再次,因此错误 stack is empty
留言
任何指示或帮助将不胜感激。
编辑:INT_MIN
指的是C99 limits.h
INT_MIN
即 -(2^32 - 1)
最佳答案
所以我想我已经解决了为什么它会这样做,首先我稍微重写了你的函数以使用切换语句来实现紧凑性(这不是你问题的解决方案):
int stack(int top, int last) {
switch(read_symbol()) {
// push n
case PUSH_SYMBOL:
return stack(read_int(), top);
// pop
case POP_SYMBOL:
if (top == INT_MIN) {
printf("pop error - stack is empty\n");
return stack(INT_MIN, INT_MIN);
}
return stack(last, INT_MIN);
// top
case TOP_SYMBOL:
if (top == INT_MIN)
printf("top error - stack is empty\n");
else
printf("top - %d\n", top);
return stack(top, last);
// empty
case EMPTY_SYMBOL:
if (top == INT_MIN)
printf("stack is empty\n");
else
printf("stack is not empty\n");
return stack(top, last);
// quit
case QUIT_SYMBOL:
if (top != INT_MIN) {
printf("quit error - stack is not empty\n");
return stack(top, last);
}
printf("goodbye\n");
case READ_FAIL: // error handling
default:
return top;
}
}
然后我遵循了假定的调用堆栈:
stack(INT_MIN, INT_MIN) receives PUSH 1 -> stack(1, INT_MIN)
stack(1, INT_MIN) receives PUSH 2 -> stack(1, 2)
stack(1, 2) receives PUSH 3 -> stack(3, 2)
stack(3, 2) receives TOP -> stack(3, 2)
stack(3, 2) receives POP -> stack(2, INT_MIN)
stack(2, INT_MIN) receives TOP -> stack(2, INT_MIN)
stack(2, INT_MIN) receives POP -> stack(INT_MIN, INT_MIN)
stack(INT_MIN, INT_MIN) receives TOP => ERROR
这里的问题很简单,pop调用stack(x, INT_MIN),这在你的代码中意味着,在pop之后,堆栈的大小只有1(或零)。不使用先前调用堆栈中的数据。
关于c - 没有数组的堆栈的递归实现 POP 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56517387/
所以下面的内容让我很困惑。 #!/usr/bin/python test = [0, 0, 0, 1, 2, 3, 4, 5, 6] test1 = [0, 0, 0, 1, 2, 3, 4, 5,
这个问题是这个问题的后续问题: deque.popleft() and list.pop(0). Is there performance difference? 在 Python 中,我可以使用 .
我正在使用 bootstrap v2.2.2。我尝试了其他一些方法(即: close popover outside popover but inside stay open 和 How to dis
我正在用 Python 创建提交后脚本并使用子进程调用 git 命令。 在我的脚本中,我想在运行某些命令之前存储所有更改,然后将它们 pop 。问题是,如果没有任何东西可以存储,stash pop 会
我有一个嵌入在 UINavigationController 中的 UITableViewController,我正在尝试将 Peek & Pop 实现到 TableView 中。我的“窥视”部分工作
我的 Windows 机器上安装了 Cygwin、msysgit 和 TortoiseGit。我正在为 Cygwin 编写一个脚本,该脚本通过 ssh 将 git 推送到远程机器: git push
我在 Jenkins 中使用groovy,并且我需要这个字符串来获取其中的最后一个单词。假设字符串是 STATUS = "EXECUTE SIT" 。所以我所做的就是分割字符串,这样我就会得到一个数组
本文是不太具体的问题的后续/重新表述 Is it possible to have a hyperlink inside {content:"..."}? . 用户 Naeem Shaikh ,非常感
Navigator.of(context).pop 和 Navigator.pop(context) 有什么区别? 对我来说两者似乎都在做同样的工作,实际的区别是什么。一个被弃用了吗? 最佳答案 Na
这可能吗?我想要一个更简单的命令来 git stash pop stash@{13} 其中 stash@{13} 只是 last 意思是“最后的存储在列表上”或“最古老的藏品”。 我知道我可以为 gi
Closed. This question is not reproducible or was caused by typos。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-to
Visual Studio 2019 中用于 GIT 存储的以下命令有什么区别? 分阶段 pop 和恢复 (--index) 全部 pop 为未暂存状态 使用https://visualstudio.
我想弹出模型的最后一层。所以我使用了 tf.keras.layers.pop(),但它不起作用。 base_model.summary() base_model.layers.pop() base_m
我想使用 navigator.pop 将值从第 2 页传递到第 1 页,并使用 initstate 中的新值刷新或重新加载我的第 1 页或任何其他解决方法? 我能够在第一页中获取这些值,但无法使用 i
pop 函数的文档说: user> (doc pop) ------------------------- clojure.core/pop ([coll]) For a list or queu
我有以下点击处理程序,当点击它时,我从 handsontable 中提取一个数组然后从数组中删除最后一个元素,并将新数组传递给 ajax post。问题是,如果我再次单击该按钮,它将从数组中删除另一个
我在mailmuch中制作了表单并从中获取了代码,我添加到网页并使用href,当用户单击显示弹出窗口时显示表单。没关系 show popup 但是现在我有ajax请求,我希望在ajax返回成功时显示此
我目前正在学习 Python 中的 pop() 函数并有一个问题。 >>> a = [1,2,3,4] >>> a.pop(3) #or a.pop() 4 >>> print(a) [1,2,3]
我目前正在学习 Python 中的 pop() 函数并有一个问题。 >>> a = [1,2,3,4] >>> a.pop(3) #or a.pop() 4 >>> print(a) [1,2,3]
我可以将对象$push编码到Mongo数组上,如下所示: db.foo.update({},{$push:{bar:3}}) 但是我找不到一种语法,可以让我对列表中的最后一项进行$pop编码。 我已经
我是一名优秀的程序员,十分优秀!