1. 程式人生 > >資料結構:通用堆疊介面

資料結構:通用堆疊介面

堆疊:堆疊是一個在電腦科學中經常使用的抽象資料型別。堆疊中的物體具有一個特性: 最後一個放入堆疊中的物體總是被最先拿出來, 這個特性通常稱為後進先出(LIFO)佇列。 堆疊中定義了一些操作。 兩個最重要的是PUSH和POP。 PUSH操作在堆疊的頂部加入一 個元素。POP操作相反, 在堆疊頂部移去一個元素, 並將堆疊的大小減一。

這裡設計了一種通用的堆疊介面,只需在程式碼中加入以下巨集定義,就可以使用巨集定義提供的通用介面,如下:

#define CREATE_NEW_STACK(DATATYPE, STACK_NAME, STACK_SIZE, ERROR)   \
    DATATYPE STACK_NAME##Array[STACK_SIZE];                         \
int STACK_NAME##_top_element = -1; \ int STACK_NAME##IsEmpty(void) \ { \ return STACK_NAME##_top_element == -1; \ } \ int
STACK_NAME##IsFull(void) \ { \ return STACK_NAME##_top_element == STACK_SIZE-1; \ } \ DATATYPE STACK_NAME##Push(DATATYPE value) \
{ \ if(STACK_NAME##IsFull()){return ERROR;} \ STACK_NAME##Array[++STACK_NAME##_top_element] = value; \ return (DATATYPE)!ERROR; \ } \ DATATYPE STACK_NAME##Pop(void) \ { \ if(STACK_NAME##IsEmpty()){return ERROR;} \ STACK_NAME##Array[STACK_NAME##_top_element--] = ERROR; \ return (DATATYPE)!ERROR; \ } \ DATATYPE STACK_NAME##Top(void) \ { \ if(STACK_NAME##IsEmpty()){return ERROR;} \ return STACK_NAME##Array[STACK_NAME##_top_element]; \ }

以上巨集定義可以提供的介面:

/******************************************************************
 *功    能:建立堆疊
 *輸    入: DATATYPE  :堆疊存放的資料的型別
 *          STACK_NAME:堆疊的名字
 *          STACK_SIZE:堆疊的大小
 *          ERROR     :自定義錯誤碼,錯誤碼資料型別必須與堆疊存放的資料的型別一致
 *返    回:無
 *注    意:注意結尾不加分號,
 ******************************************************************/
CREATE_NEW_STACK(DATATYPE, STACK_NAME, STACK_SIZE, ERROR)


/******************************************************************
 *功    能:判斷堆疊是否為空
 *輸    入:無
 *返    回:0:不為空
           1:為空
 *注    意:將[STACK_NAME]替換成堆疊的名字
 ******************************************************************/
int [STACK_NAME]IsEmpty(void);


/******************************************************************
 *功    能:判斷堆疊是否存滿
 *輸    入:無
 *返    回:0:未存滿
           1:存滿
 *注    意:將[STACK_NAME]替換成堆疊的名字
 ******************************************************************/
int [STACK_NAME]IsFull(void);


/******************************************************************
 *功    能:入棧
 *輸    入:DATATYPE value:要壓入堆疊的資料
 *返    回:ERROR :入棧出錯
           !ERROR:入棧成功
 *注    意:將[STACK_NAME]替換成堆疊的名字
 ******************************************************************/
DATATYPE [STACK_NAME]Push(DATATYPE value); 


/******************************************************************
 *功    能:出棧
 *輸    入:無
 *返    回:ERROR :出棧出錯
           !ERROR:出棧成功
 *注    意:將[STACK_NAME]替換成堆疊的名字
 ******************************************************************/
DATATYPE [STACK_NAME]Pop(void);


/******************************************************************
 *功    能:獲取棧頂的資料
 *輸    入:無
 *返    回:棧頂的資料
 *注    意:將[STACK_NAME]替換成堆疊的名字
 ******************************************************************/
DATATYPE [STACK_NAME]Top(void);

應用舉例

#include <iostream>

using namespace std;

#define CREATE_NEW_STACK(DATATYPE, STACK_NAME, STACK_SIZE, ERROR)   \
    DATATYPE STACK_NAME##Array[STACK_SIZE];                         \
    int STACK_NAME##_top_element = -1;                              \
    int STACK_NAME##IsEmpty(void)                                   \
    {                                                               \
        return STACK_NAME##_top_element == -1;                      \
    }                                                               \
    int STACK_NAME##IsFull(void)                                    \
    {                                                               \
        return STACK_NAME##_top_element == STACK_SIZE-1;            \
    }                                                               \
    DATATYPE STACK_NAME##Push(DATATYPE value)                       \
    {                                                               \
        if(STACK_NAME##IsFull()){return ERROR;}                     \
        STACK_NAME##Array[++STACK_NAME##_top_element] = value;      \
        return (DATATYPE)!ERROR;                                    \
    }                                                               \
    DATATYPE STACK_NAME##Pop(void)                                  \
    {                                                               \
        if(STACK_NAME##IsEmpty()){return ERROR;}                    \
        STACK_NAME##Array[STACK_NAME##_top_element--] = ERROR;      \
        return (DATATYPE)!ERROR;                                    \
    }                                                               \
    DATATYPE STACK_NAME##Top(void)                                  \
    {                                                               \
        if(STACK_NAME##IsEmpty()){return ERROR;}                    \
        return STACK_NAME##Array[STACK_NAME##_top_element];         \
    }

//建立堆疊1
CREATE_NEW_STACK(int, stack1, 10, -1)
//建立堆疊2
CREATE_NEW_STACK(const char *, stack2, 255, NULL)

int main()
{
    int a = 1;
    int b = 3;
    int c = 5;
    const char *p1 = "this is test one";
    const char *p2 = "this is test two";

    //堆疊1入棧
    if (-1 == stack1Push(a))
    {
        return -1;
    }
    if (-1 == stack1Push(b))
    {
        return -1;
    }
    if (-1 == stack1Push(c))
    {
        return -1;
    }

    //堆疊2入棧
    if (NULL == stack2Push(p1))
    {
        return -1;
    }

    if (NULL == stack2Push(p2))
    {
        return -1;
    }

    //堆疊1驗證
    printf("satck1_top: %d\r\n",stack1Top());
    if (-1 == stack1Pop())
    {
        return -1;
    }
    printf("satck1_top: %d\r\n", stack1Top());
    if (-1 == stack1Pop())
    {
        return - 1;
    }
    printf("satck1_top: %d\r\n", stack1Top());

    //堆疊2驗證
    printf("satck2_top: %s\r\n",stack2Top());
    if (NULL == stack2Pop())
    {
        return -1;
    }
    printf("satck2_top: %s\r\n", stack2Top());

    system("pause");//輸出後暫停在cmd中

    return 0;
}

如圖:
通用堆疊介面應用舉例
通用堆疊介面應用舉例
通用堆疊介面應用舉例