- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我刚刚来到书中解释堆栈的部分。以下是它们在我的书中的定义方式(代码):
#include <stdbool.h>
#define STACK_SIZE 100
int contents[STAC_SIZE]
int top = 0;
void make_empty(void){
top = 0;
}
bool is_empty(void){
return top == 0;
}
bool is_full(void){
return top == STACK_SIZE;
}
void push(int i){
if(is_full()){
stack_overflow();
}
else{
contents[top++] = I;
}
int pop(void){
if(is_empty()){
stack_underflow();
}
else{
return contents[--top];
}
}
我在这里没有得到两件事:
make_empty()
函数如何工作?通过将 top
初始化为 0,contents
仍然加载了所有元素...contents
不应该也被初始化吗?<stack_overflow()
和 stack_underflow()
函数的作用是什么?它们的行为是否在 stdio.h
中默认定义?如果是这样,当他们接到电话时会发生什么?如果没有,我应该自己定义它们吗?另外,出于好奇,是否有一个库已经定义了所有堆栈函数?
最佳答案
how can the make_empty() function work?
这样想:你期望 make_empty
达到什么效果?嗯,显然是为了清空堆栈,但这对于我们拥有的接口(interface)来说意味着什么?有几点:
is_empty
应该为 true。设置 top = 0
可以实现这一点吗?是的,因为 is_empty
只是检查 top == 0
。top = 0
可以实现这一点吗?是的,因为如果 is_empty
为 true,pop
将导致下溢,事实也确实如此。STACK_SIZE
次。设置 top = 0
可以实现这一点吗?是的,因为 push
每次都会将 top
加一,直到 top == STACK_SIZE
才会导致溢出。因此,如果 top
为零,我们可以推送 STACK_SIZE
次。By just initializing top to 0, contents has still all its elements loaded in... shouldn't contents be initialized as well?
为了什么?大小为 0 的数组?我们不能这样做,因为 contents
已被声明为 STACK_SIZE
大小,而不是 0。数组的大小是固定的,永远不会改变。
我们可以将所有元素设置为 0,但这实际上不会完成任何事情。索引为 >= top
的元素的值永远不会影响任何东西,那么为什么要费心去改变它们呢?
what do the 2 stack_overflow() and stack_underflow() functions do?
大概他们应该告诉用户发生了溢出或下溢,然后退出应用程序或调用某种错误处理程序。
Is their behavior defined by default in stdio.h?
没有。
If not, am I supposed to define them by myself?
大概。
关于c - stack_overflow() 函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53672398/
我的快速排序代码适用于 N(列表大小)的某些值,但对于大值(例如,N = 82031),OCaml 返回的错误是: Fatal error: exception Stack_overflow. 我做错
所以我刚刚来到书中解释堆栈的部分。以下是它们在我的书中的定义方式(代码): #include #define STACK_SIZE 100 int contents[STAC_SIZE] int t
我想问下exception :"exception Stack_overflow"是否会导致死循环,特别是异常出现在下面的代码中: ( *the loop "while" should sto
如果在 .dll 中使用此代码, 对 socket.recv() 的调用会引发一个异常 STACK_OVERFLOW,但是当此代码编译为 .exe 时,它可以正常工作。 为什么? 我通过“C:\win
我是一名优秀的程序员,十分优秀!