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 —–