在非遞歸二叉樹中序遍歷 InOrderTraverse(BiTree T, Status(*Visit)(TElemType e)) 中,Visit 作為函數指針參數傳入,而 InitStack、Push 等棧操作直接在函數內調用。兩者本質區別在於策略的可替換性。
| 維度 | 函數指針參數 (Visit) | 直接調用 (InitStack/Push) |
|---|---|---|
| 耦合度 | 低:遍歷邏輯與訪問操作解耦 | 高:遍歷邏輯強依賴具體棧實現 |
| 靈活性 | 高:可傳入打印、求和、序列化等任意訪問策略 | 低:更換棧實現需修改遍歷函數代碼 |
| 適用場景 | 行為策略多變、需用戶自定義回調 | 基礎設施固定、不頻繁變更的工具函數 |
| 編譯依賴 | 僅需函數指針類型聲明 | 需包含棧操作頭文件,增加編譯依賴 |
StackInterface 結構體包含函數指針,遍歷函數接收該結構體指針,類似 C++ 虛函數表模式。此例完美演示了 C 語言中「策略模式」的函數指針實現,是系統級軟件(如 Linux 內核 VFS、文件系統操作向量)的經典設計範式。