数据结构:通用堆栈接口

堆栈:堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(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;
}

如图:
通用堆栈接口应用举例
通用堆栈接口应用举例
通用堆栈接口应用举例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

izar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值