1. 程式人生 > >通用棧的設計和實現[C語言]

通用棧的設計和實現[C語言]

  • 作者:鄒祁峰
  • 郵箱:[email protected]
  • 日期:2013.03.09  凌晨02:18
  • 轉載請註明來自"祁峰"的CSDN部落格

1 棧定義

typedef struct
{
	void **base; /* 棧底 */
	void **top;  /* 棧頂 */
	int size;    /* 棧的大小 */
}stack_t;

程式碼1 棧定義

在此設計的通用棧將會達到以下兩點要求:

1) 可以處理任意的資料型別

請注意棧中base和top的資料型別,其為void**,因此其可以處理各種資料型別

2) 高效的資料操作和訪問

  void**其為雙指標,意味入棧和出棧的將只是對應資料的地址,而不需要對資料本身進行拷貝,因此也達到了高效的目的。

2 巨集定義

  為提高棧的操作訪問效率,可使用巨集定義:

#define stack_maxsize(stack) (stack->size)
#define stack_isempty(stack) (stack->top == stack->base)
#define stack_depth(stack) (stack->top - stack->base)
#define stack_gettop(stack) ((stack->top == stack->base)? NULL: *(stack->top - 1))

程式碼2 巨集定義

3 操作介面

/****************************************************************************** 
 **函式名稱: stack_init
 **功    能: 初始化棧
 **輸入引數:
 **    stack: 棧
 **    size: 棧的容量
 **輸出引數: NONE
 **返    回: 0:成功 !0:失敗
 **實現描述:
 **    1. 申請空間
 **    2. 初始化變數
 **注意事項:
 **作    者: # Qifeng.zou # 2013.03.09 #
 ******************************************************************************/
int stack_init(stack_t *stack, int size)
{
    memset(stack, 0, sizeof(stack_t));

    stack->base = (void**)calloc(size, sizeof(void*));
    if(NULL == stack->base)
    {
        return -1;
    }
    stack->top = stack->base;
    stack->size = size;
    return 0;
}
程式碼3 初始化

/******************************************************************************
 **函式名稱: stack_push
 **功    能: 壓棧
 **輸入引數:
 **    stack: 棧
 **    node: 入棧資料
 **輸出引數: NONE
 **返    回: 0:成功 !0:失敗
 **實現描述:
 **    1. 判斷棧是否已滿
 **    2. 將棧頂指標指向入棧資料
 **    3. 棧頂指標加1
 **注意事項:
 **作    者: # Qifeng.zou # 2013.03.09 #
 ******************************************************************************/
int stack_push(stack_t *stack, void *node)
{
    if(stack->top - stack->base >= stack->szie)
    {
        return -1;
    }
    *(stack->top) = node;
    stack->top++;
    return 0;
}
程式碼4 入棧

/******************************************************************************
 **函式名稱: stack_pop
 **功    能: 出棧
 **輸入引數:
 **    stack: 棧
 **輸出引數: NONE
 **返    回: 0:成功 !0:失敗
 **實現描述:
 **    1. 判斷棧是否已空
 **    2. 棧頂指標減1
 **注意事項:
 **    注意:只負責資料出棧,而不負責出棧資料的釋放!
 **作    者: # Qifeng.zou # 2013.03.09 #
 ******************************************************************************/
int stack_pop(stack *stack)
{
    if(stack->top == stack->base)
    {
        return -1;	
    }
    stack->top--;
    *(stack->top) = NULL;
    return 0;
}
程式碼5 出棧
/******************************************************************************
 **函式名稱: stack_destroy
 **功    能: 釋放棧
 **輸入引數:
 **    stack: 棧
 **輸出引數: NONE
 **返    回: 0:成功 !0:失敗
 **實現描述:
 **    1. 釋放空間
 **    2. 重置變數
 **注意事項:
 **作    者: # Qifeng.zou # 2013.03.09 #
 ******************************************************************************/
void stack_free(stack_t *stack)
{
	free(stack->base);
	stack->base = NULL;
	stack->top = NULL;
	stack->size = 0;
}
程式碼6 銷燬

相關推薦

通用設計實現[C語言]

作者:鄒祁峰 郵箱:[email protected] 日期:2013.03.09  凌晨02:18 轉載請註明來自"祁峰"的CSDN部落格 1 棧定義 typedef struct

通用執行緒池的設計實現[C語言]

作者:鄒祁峰 郵箱:[email protected] 日期:2012.12.28 轉載請註明來自"祁峰"的CSDN部落格 1 適用場景     首先,必須明確一點,執行緒池不是萬能的,

通用執行緒池的設計實現 C語言

                作者:鄒祁峰 郵箱:[email protected] 部落格

記憶體池的設計實現 -- C++應用程式效能優化

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

磁碟排程演算法設計實現——C語言

一、設計分析共享裝置的典型代表為磁碟,磁碟物理塊的地址由柱面號、磁頭號、扇區號來指定,完成磁碟某一個物理塊的訪問要經過三個階段:尋道時間Ts、旋轉延遲時間Tw和讀寫時間Trw。尋道時間Ts是磁頭從當前磁軌移動到目標磁軌所需要的時間;旋轉延遲時間Tw是當磁頭停留在目標磁軌後,目

佇列 C語言實現

1、棧的概念 棧又稱堆疊,它是一種運算受限的線性表,其限制是僅允許在表的一端進行插入和刪除運算。 2、棧的順序儲存結構和操作實現 棧的順序儲存結構示意圖: 下面通過一個例項展示棧的順序儲存結構的操作實現,其中包含了6種操作: #include<stdio.h>

C#定時調用的Quartz項目設計實現

() pub factor 總結 entity com hid 項目設計 tor 1.首先必須清楚一些概念:調度器,作業,定時觸發器,如下 2.關於一個Quartz定時調用的項目的設計和實現   把需要的東西抽象出來,比如把作業的一些屬性,如作業的名稱等,如下 1

leetcode 707設計連結串列 c語言實現

這道題我用c寫的,寫過程中出現了好多bug,唉,還是對連結串列不是很熟,比如在插入結點時,如果是首結點該如何處理。好在最後還能正常寫出來了~~~ 題目描述 設計連結串列的實現。您可以選擇使用單鏈表或雙鏈表。單鏈表中的節點應該具有兩個屬性:val 和 next。val 是當前節點的值,

資料結構之(Stack)的關於C語言實現

C語言實現棧共有兩種方法,一種是使用陣列的包含最大Size的棧,另外一種是運用連結串列的方法實現 關於陣列方法實現的程式碼如下: #include<stdio.h> /** * Your MinStack struct will be instantiate

[原始碼和文件分享]基於C#SQL SERVER的企業進銷存管理系統的設計實現

摘要 進銷存管理是現代企業生產經營中的重要環節,是完成企業資源配置的重要管理工作,對企業生產經營效率的最大化發揮著重要作用。本文以我國中小企業的進銷存管理為研究物件,描述了企業進銷存管理系統從需求分析、系統設計、系統實現到系統測試的全週期。在本次設計確定了進銷存系統的基礎功能需求,深入剖析了企業

記憶體池的設計實現 -- 《C++應用程式效能優化》

本書主要針對的是 C++ 程式的效能優化,深入介紹 C++ 程式效能優化的方法和例項。全書由 4 個篇組成,第 1 篇介紹 C++ 語言的物件模型,該篇是優化 C++ 程式的基礎;第 2 篇主要針對如何優化 C++ 程式的記憶體使用;第 3 篇介紹如何優化程式的啟動效能;第 4 篇介紹了三類效能優化工具,即

常見設計模式的解析實現(C++)之十七-State模式

作用:允許一個物件在其內部狀態改變時改變它的行為.UML結構圖:解析:State模式主要解決的是在開發中時常遇到的根據不同的狀態需要進行不同的處理操作的問題,而這樣的問題,大部分人是採用switch-case語句進行處理的,這樣會造成一個問題:分支過多,而且如果加入一個新的狀態就需要對原來的程式碼進行

常見設計模式的解析實現(C++)之二十-Visitor模式

作用:表示一個作用於某物件結構中的各元素的操作.它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作.UML結構圖:解析:Visitor模式把對結點的訪問封裝成一個抽象基類,通過派生出不同的類生成新的訪問方式.在實現的時候,在visitor抽象基類中聲明瞭對所有不同結點進行訪問的介面函式,如

常見設計模式的解析實現(C++)之十六-Strategy模式

作用:定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換.本模式使得演算法可獨立於使用它的客戶而變化.UML結構圖:解析:簡而言之一句話,Strategy模式是對演算法的封裝.處理一個問題的時候可能有多種演算法,這些演算法的介面(輸入引數,輸出引數等)都是一致的,那麼可以考慮採用Stra

常見設計模式的解析實現(C++)之十九-Memento模式

作用:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態.這樣以後就可將該物件恢復到原先儲存的狀態.UML結構圖:解析:Memento模式中封裝的是需要儲存的狀態,當需要恢復的時候才取出來進行恢復.原理很簡單,實現的時候需要注意一個地方:窄介面和寬介面.所謂的寬介面就是一般意義

常見設計模式的解析實現(C++)之十五-Observer模式

作用:定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新.UML結構圖:解析:Observer模式定義的是一種一對多的關係,這裡的一就是圖中的Subject類,而多則是Obesrver類,當Subject類的狀態發生變化的時候通知與之對應的Obesr

常見設計模式的解析實現(C++)之十八-Iterator模式

作用:提供一種方法順序訪問一個聚合物件中各個元素,,而又不需暴露該物件的內部表示.UML結構圖:解析:Iterator幾乎是大部分人在初學C++的時候就無意之中接觸到的第一種設計模式,因為在STL之中,所有的容器類都有與之相關的迭代器.以前初學STL的時候,時常在看到講述迭代器作用的時候是這麼說的:提

常見設計模式的解析實現(C++)之二十一-完結篇

        一個月下來,把常見的20個設計模式好好複習並且逐個用C++實現了一遍,收穫還是很大的,很多東西看上去明白了但是真正動手去做的時候發現其實還是不明白--我深知這個道理,於是不敢怠慢,不敢寫什麼所謂的解釋原理的虛擬碼,不敢說所謂的"知道原理就可以了"....因為我知道,我還還沒有資

常見設計模式的解析實現(C++)之十四-Command模式

作用:將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可撤消的操作.UML結構圖:解析:Comnand模式的思想是把命令封裝在一個類中,就是這裡的Command基類,同時把接收物件也封裝在一個類中就是這裡的Receiver類中,由呼叫這個命令的類也就

字尾表示式的實現(C語言

中綴表示式轉為字尾表示式: 1.遇到運算元:直接輸出(新增到字尾表示式中) 2.棧為空時,遇到運算子,直接入棧 3.遇到左括號:將其入棧 4.遇到右括號:執行出棧操作,並將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出。 5.遇到其他運算子:加減乘除:彈出所有優先順序大