資料結構:通用堆疊介面
阿新 • • 發佈:2019-01-22
堆疊:堆疊是一個在電腦科學中經常使用的抽象資料型別。堆疊中的物體具有一個特性: 最後一個放入堆疊中的物體總是被最先拿出來, 這個特性通常稱為後進先出(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;
}
如圖: