[英]How does the stack_overflow() function work?
因此,我剛進入書中解釋堆棧的部分。 在我的書(代碼)中定義它們的方式如下:
#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
定義? 如果是這樣,當他們接到電話時會發生什么? 如果沒有,我應該自己定義它們嗎? 另外,出於好奇,是否有一個庫已經定義了所有堆棧函數?
要按順序回答您的問題:
make_empty()
之所以這樣工作,是因為push()
函數將元素放在堆棧的當前top
。 是的, contents
仍然具有來自堆棧的舊值,但這並不重要,因為它們將被覆蓋。
我認為將stack_overflow()
和stack_underflow()
放在此處只是為了說明在對整個堆棧進行推送或對空堆棧進行彈出操作時的正常行為。 它們未在stdio.h中實現。 如果確實需要,可以自己創建它們,並包含一個printf,例如
void stack_overflow() { printf("Stack Overflow! The program will crash!"); exit(1); //this function exits the program. It is defined in stdlib.h }
top
變量告訴實現,堆棧的頂部在哪里,或者等效地,它包含多少個元素。 這說明邏輯內容,而不是堆棧占用的物理內存。 因為此實現使用數組存儲堆棧元素,所以每個可用位置將始終存儲一些值。 關鍵問題是與真正的堆棧元素 相對應 ,而這正是top
所描述的。 因此, make_empty()
通過調整top
來說堆棧存儲不包含實際的堆棧元素而起作用。 整個存儲可用於元素。
stack_overflow()
和stack_underflow()
不是標准函數。 名稱似乎旨在傳達在這種情況下發生堆棧溢出或堆棧下溢的想法,而沒有指定任何特定行為。
現實世界中的實現可能會實現那些功能以發出診斷消息,返回錯誤代碼(如果為示例提供了實現,但示例中沒有提供),終止,或者如果有點偽劣,則在這些行為中開始未定義的行為案件。 在溢出的情況下,也可能會擴展堆棧,但是您的特定示例的詳細信息並沒有提供這種可能性。
make_empty()函數如何工作?
這樣考慮:您期望make_empty
有什么作用? 好吧,顯然要清空堆棧,但是就我們擁有的接口而言,這意味着什么呢? 有兩件事:
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
次。 通過僅將top初始化為0,內容仍然加載了所有元素...內容是否也應該初始化?
要什么? 大小為0的數組? 我們不能這樣做,因為已聲明contents
大小為STACK_SIZE
,而不是0。數組的大小是固定的,並且永遠不會改變。
我們可以將所有元素都設置為0,但這實際上不會完成任何事情。 索引>= top
的元素的值永遠不會影響任何東西,那么為什么要麻煩更改它們呢?
2個stack_overflow()和stack_underflow()函數有什么作用?
大概他們應該告訴用戶發生了上溢或下溢,然后退出應用程序或調用某種錯誤處理程序。
是否在stdio.h中默認定義了它們的行為?
沒有。
如果沒有,我應該自己定義它們嗎?
想必。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.