棧的實現 與static

2021-10-05 23:14:45 字數 2486 閱讀 5394

在實現棧的通用性過程中遇到的問題(段錯誤)

先上**

seqstack.h

#ifndef stack_h

#define stack_h

#include

// 該程式模組提供棧的功能

// 預設處理的是int資料

// 使用者如需處理其他自定義資料,請定義如下巨集,如:

// #define seqstack_node ***

// 如果使用者沒有自定義順序棧元素型別

// 那麼型別預設為int

#ifndef seqstack_node

#define seqstack_node int

#endif

typedef seqstack_node datatype;

// 順序棧的管理結構體

typedef

struct seqstack

stack;

// 以下是棧的操作介面

// 初始化

// size: 初始狀態下,空棧的容量

stack *

init_stack

(int size)

;// 入棧

// 成功返回真,失敗(當棧已滿的時候)返回假

bool push

(stack *s, datatype data)

;// 出棧: 將棧頂元素刪除

// 成功返回真,失敗(當棧為空的時候)返回假

bool pop

(stack *s)

;// 讀取棧頂: 將棧頂元素返回

bool top

(stack *s, datatype *pdata)

;// 判斷滿

bool full

(stack *s)

;// 判斷空

bool empty

(stack *s)

;#endif

seqstack.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

"seqstack.h"

// 棧的初始化

// 成功時,返回棧的管理結構體指標

// 失敗時,返回null

stack *

init_stack

(int size)

}return s;

}// 入棧: 將資料data,置入棧s的棧頂中

bool push

(stack *s, datatype data)

// 出棧: 將棧頂元素刪除

bool pop

(stack *s)

// 取棧頂元素

bool top

(stack *s, datatype *pdata)

// 判斷棧是否已滿、是否為空

bool empty

(stack *s)

bool full

(stack *s)

//使用預設引數測試**、程式正常執行 ok

test.c

#include

#include

"seqstack.h"

intmain

(void

)printf

("\n");

return0;

}

通過以上你以為程式沒有bug嗎?

再看看使用一下**測試(自定義型別引數)

test_char.c

#include

#define seqstack_node char

#include

"seqstack.h"

intmain

(void

)printf

("\n");

return0;

}

以上**似乎沒有什麼錯誤,但是這會產生段錯誤。

下面分析一下段錯誤產生的原因及解決方法:

![在這裡插入描述](

總結一下:seqstack.c 與test_char.c 的資料型別不同,導致段錯誤

解決方法:將seqstack.c 的**放置到seqstack.h,即將它們合為1個.h 檔案即可。並將函式宣告為static,因為static函式才能在標頭檔案中定義實現。

缺點:無法將.**件變為動態庫。

如有不對,懇請指正!

棧的實現與應用

棧 棧 stack 是限定盡在表尾進行插入或刪除操作的線性表。與線性表類似,棧也有兩種儲存表示方式。下面是順序棧的實現。include include define maxsize 100 typedef char elemtype 定義順序棧 typedef struct sqstack 初始化棧...

棧與佇列的實現

利用順序表實現棧 include include include include typedef struct position position typedef int sdatatype define max size 100 typedef struct stack stack 初始化 voi...

棧與遞迴的實現

對於棧有些問題還不是很熟悉,所以暫時需要些時間去理解,需要多寫些 去體會,棧還有乙個重要應用是在程式語言中實現遞迴,所以這次主要是講遞迴的實現,大家熟悉的階乘函式,2階fibonacci數列和ackerman函式等,其次還有的資料結構,如二叉樹 廣義表等,由於結構本身固有的遞迴特性,則它們的操作可遞...