数据结构--顺序堆栈

1. 简介

栈是限制在一段进行插入操作和删除操作的线性表(俗称堆栈),允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素称为“空栈”。特点:先进后出(FILO)。

2. 源码

[SeqStack.c]

/*
*********************************************************************************************************
* @file     SeqStack.c
* @author   SY
* @version  V1.0.1
* @date     2016-9-12 13:30:32
* @IDE      V4.70.0.0
* @Chip     STM32F407VE
* @brief    顺序堆栈源文件
*********************************************************************************************************
* @attention
*   栈是限制在一段进行插入操作和删除操作的线性表(俗称堆栈),允许进行操作的一端称为“栈顶”,
*   另一固定端称为“栈底”,当栈中没有元素称为“空栈”。特点:先进后出(FILO)。
* ---------------------------------------------------------
* 版本:V1.0.1     修改人:SY      修改日期:2016-9-12 13:30:37
* 
* 1、增加顺序堆栈的遍历。
* -------------------------------------------------------------------------------------------------------
*   
* 
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                           Private Includes
*********************************************************************************************************
*/
#include "utils.h"
#include "SeqStack.h"


/*
*********************************************************************************************************
*                                           Private define
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                           Private typedef
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                           Private constants
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                           Private macro
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                           Private variables
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                           Private function prototypes
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                           Private functions
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* Function Name : CreateSeqStack
* Description   : 创建顺序堆栈(内存空间由外部提供、静态内存)
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
void CreateSeqStack( SEQ_STACK_TypeDef *stackPtr, void *pBase, uint32_t lenth )
{
    stackPtr->basePtr = pBase;
    stackPtr->maxLenth = lenth;
    stackPtr->top = 0;
}

/*
*********************************************************************************************************
* Function Name : SeqStackIsFull
* Description   : 顺序堆栈是否为满
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
DATA_STRUCT_STATUS_ENUM SeqStackIsFull( SEQ_STACK_TypeDef *stackPtr )
{
    if (stackPtr->top == stackPtr->maxLenth)
    {
        return STATUS_DATA_STRUCT_TRUE;
    }
    else
    {
        return STATUS_DATA_STRUCT_FALSE;
    }
}

/*
*********************************************************************************************************
* Function Name : SeqStackIsEmpty
* Description   : 顺序堆栈是否为空
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
DATA_STRUCT_STATUS_ENUM SeqStackIsEmpty( SEQ_STACK_TypeDef *stackPtr )
{
    if (stackPtr->top == 0)
    {
        return STATUS_DATA_STRUCT_TRUE;
    }
    else
    {
        return STATUS_DATA_STRUCT_FALSE;
    }
}

/*
*********************************************************************************************************
* Function Name : GetSeqStackLenth
* Description   : 获取顺序堆栈长度
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
uint32_t GetSeqStackLenth( SEQ_STACK_TypeDef *stackPtr )
{
    return stackPtr->maxLenth;
}

/*
*********************************************************************************************************
* Function Name : ClearSeqStack
* Description   : 清空堆栈
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
void ClearSeqStack( SEQ_STACK_TypeDef *stackPtr )
{
    stackPtr->top = 0;
}

/*
*********************************************************************************************************
* Function Name : PushSeqStack
* Description   : 入栈
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
DATA_STRUCT_STATUS_ENUM PushSeqStack( SEQ_STACK_TypeDef *stackPtr, void *dataIn,\
        void (*push_CallBack)( void *base, uint32_t offset, void *data ) )
{
    if (SeqStackIsFull(stackPtr) == STATUS_DATA_STRUCT_TRUE)
    {
        return STATUS_DATA_STRUCT_FALSE;
    }

    push_CallBack(stackPtr->basePtr, stackPtr->top, dataIn);
    stackPtr->top++;

    return STATUS_DATA_STRUCT_TRUE;
}

/*
*********************************************************************************************************
* Function Name : PopSeqStack
* Description   : 出栈
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
DATA_STRUCT_STATUS_ENUM PopSeqStack( SEQ_STACK_TypeDef *stackPtr, void *dataOut,\
        void (*pop_CallBack)( void *base, uint32_t offset, void *data ) )
{
    if (SeqStackIsEmpty(stackPtr) == STATUS_DATA_STRUCT_TRUE)
    {
        return STATUS_DATA_STRUCT_FALSE;
    }

    stackPtr->top--;
    pop_CallBack(stackPtr->basePtr, stackPtr->top, dataOut);

    return STATUS_DATA_STRUCT_TRUE;
}

/*
*********************************************************************************************************
* Function Name : GetSeqStackElement
* Description   : 获取顺序堆栈元素
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
DATA_STRUCT_STATUS_ENUM GetSeqStackElement( SEQ_STACK_TypeDef *stackPtr, void *dataOut,\
        void (*pop_CallBack)( void *base, uint32_t offset, void *data ) )
{
    SEQ_STACK_TypeDef stack = *stackPtr;

    return PopSeqStack(&stack,dataOut,pop_CallBack);
}

/*
*********************************************************************************************************
* Function Name : TraverseSeqStack
* Description   : 遍历顺序堆栈
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
void TraverseSeqStack( SEQ_STACK_TypeDef *stackPtr, void *dataOut,\
        void (*pop_CallBack)( void *base, uint32_t offset, void *data ),\
        void (*show_CallBack)( void *dataOut ) )
{
    SEQ_STACK_TypeDef stack = *stackPtr;

    while ( PopSeqStack(&stack, dataOut, pop_CallBack) == STATUS_DATA_STRUCT_TRUE)
    {
        if (show_CallBack)
        {
            show_CallBack(dataOut);
        }
    }
}

/************************ (C) COPYRIGHT STMicroelectronics **********END OF FILE*************************/
[SeqStack.h]

/*
*********************************************************************************************************
* @file     SeqStack.h
* @author   SY
* @version  V1.0.0
* @date     2016-9-2 09:39:06
* @IDE      V4.70.0.0
* @Chip     STM32F407VE
* @brief    顺序堆栈头文件
*********************************************************************************************************
* @attention
*
* 
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                           Define to prevent recursive inclusion
*********************************************************************************************************
*/
#ifndef __SEQSTACK_H
#define __SEQSTACK_H

/*
*********************************************************************************************************
*                                           Exported Includes
*********************************************************************************************************
*/



/*
*********************************************************************************************************
*                                           Exported define
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                           Exported types
*********************************************************************************************************
*/
typedef struct
{
    void *basePtr;
    uint32_t maxLenth;
    uint32_t top;
}SEQ_STACK_TypeDef;

/*
*********************************************************************************************************
*                                           Exported constants
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                           Exported macro
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* Function Name : PushSeqStackU8_CallBack
* Description   : 8Bit整型数据入栈
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
__STATIC_INLINE void PushSeqStackU8_CallBack( void *base, uint32_t offset, void *dataIn )
{
    uint8_t *dataPtr = dataIn;
    uint8_t *basePtr = base;

    basePtr[offset] = *dataPtr;
}

/*
*********************************************************************************************************
* Function Name : PopSeqStackU8_CallBack
* Description   : 8Bit整型数据出栈
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
__STATIC_INLINE void PopSeqStackU8_CallBack( void *base, uint32_t offset, void *dataOut )
{
    uint8_t *dataPtr = dataOut;
    uint8_t *basePtr = base;

    *dataPtr = basePtr[offset];
}

/*
*********************************************************************************************************
*                                           Exported variables
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                           Exported functions
*********************************************************************************************************
*/
void CreateSeqStack( SEQ_STACK_TypeDef *stackPtr, void *pBase, uint32_t lenth );
DATA_STRUCT_STATUS_ENUM SeqStackIsFull( SEQ_STACK_TypeDef *stackPtr );
DATA_STRUCT_STATUS_ENUM SeqStackIsEmpty( SEQ_STACK_TypeDef *stackPtr );
uint32_t GetSeqStackLenth( SEQ_STACK_TypeDef *stackPtr );
void ClearSeqStack( SEQ_STACK_TypeDef *stackPtr );
DATA_STRUCT_STATUS_ENUM PushSeqStack( SEQ_STACK_TypeDef *stackPtr, void *dataIn,\
        void (*push_CallBack)( void *base, uint32_t offset, void *data ) );
DATA_STRUCT_STATUS_ENUM PopSeqStack( SEQ_STACK_TypeDef *stackPtr, void *dataOut,\
        void (*pop_CallBack)( void *base, uint32_t offset, void *data ) );
DATA_STRUCT_STATUS_ENUM GetSeqStackElement( SEQ_STACK_TypeDef *stackPtr, void *dataOut,\
        void (*pop_CallBack)( void *base, uint32_t offset, void *data ) );
void TraverseSeqStack( SEQ_STACK_TypeDef *stackPtr, void *dataOut,\
        void (*pop_CallBack)( void *base, uint32_t offset, void *data ),\
        void (*show_CallBack)( void *dataOut ) );

#endif
/************************ (C) COPYRIGHT STMicroelectronics **********END OF FILE*************************/

备注:


1、 本文实现的顺序堆栈,以数组为基本结构。将泛型编程思想贯穿始末,只提供操作堆栈的方法,不提供实际数据类型、存储空间、数组地址及长度。全部由被调函数指定,这样做虽然看上去更加复杂,实际上适用性非常强,可以移植到任何需要顺序堆栈的地方。

3. 测试

[main.c]

/*
*********************************************************************************************************
* Function Name : PrintSeqQueue
* Description   : 打印顺序队列
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
void PrintSeqQueue( void *data )
{
    uint8_t *temp = data;

    printf("%d\r\n",*temp);
}

/*
*********************************************************************************************************
* Function Name : TestSeqStack
* Description   : 测试顺序堆栈
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
void TestSeqStack( void )
{
    const uint32_t MAX_STACK_NUMS = 10;
    static uint8_t s_stack[MAX_STACK_NUMS];
    SEQ_STACK_TypeDef stack;

    CreateSeqStack(&stack, s_stack, MAX_STACK_NUMS);

    {
        for (uint8_t i=1; i<=5; ++i)
        {
            PushSeqStack(&stack, &i,PushSeqStackU8_CallBack);
        }

        printf("----- STATR -----\r\n");
        uint8_t tempData = 0;
        TraverseSeqStack(&stack, &tempData, PopSeqStackU8_CallBack, PrintSeqQueue);
        printf("----- E N D -----\r\n\r\n");
    }

    {
        uint8_t tempData = 0;
        PopSeqStack(&stack, &tempData,PopSeqStackU8_CallBack);
        printf("出栈元素:%d\r\n",tempData);

        printf("----- STATR -----\r\n");
        TraverseSeqStack(&stack, &tempData, PopSeqStackU8_CallBack, PrintSeqQueue);
        printf("----- E N D -----\r\n\r\n");
    }

    {
        uint8_t tempData = 0;
        GetSeqStackElement(&stack, &tempData,PopSeqStackU8_CallBack);
        printf("读取元素:%d\r\n",tempData);

        printf("----- STATR -----\r\n");
        TraverseSeqStack(&stack, &tempData, PopSeqStackU8_CallBack, PrintSeqQueue);
        printf("----- E N D -----\r\n\r\n");
    }
}

/*
*********************************************************************************************************
* Function Name : main
* Description   : 入口函数
* Input         : None
* Output        : None
* Return        : None
*********************************************************************************************************
*/
int main( void )
{
    InitSystem();

    TestSeqStack();

    while (1);  
}

打印结果:


—– STATR —–
5
4
3
2
1
—– E N D —–

出栈元素:5
—– STATR —–
4
3
2
1
—– E N D —–

读取元素:4
—– STATR —–
4
3
2
1
—– E N D —–

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值