对栈的理解记住“先进后出”就可以了,什么意思呢?就是向桶里放积木只能拿出最上层的积木,然后一层一层的拿出这样理解的话就简单了,只用一个节点一直指向栈的最上层的节点就可以了。
1.首先想构造的数据结构是什么样子的?需要存储的数据有哪些?存储的数据可以根据自己的需求去添加, 在我设计的数据中只有一个那就是int 类型的data数据如下所示:
typedef struct STACKNODE
{
int data; //存放数据可以任意添加
struct STACKNODE *pNext; //指向下一结点
}stackNode;
typedef struct STACKHEAD
{
stackNode *top; //指向栈顶
stackNode *base; //指向栈底
int height; //栈的高度
}stackHead;
2.函数的实现
/*
** @brief 创建一个高度为 height 的栈
**
** @param 无
**
** @return 返回指向新建的栈的指针
*/
stackHead *initStack()
{
stackHead * pStack= (stackHead *)malloc(sizeof(stackHead ));
if(NULL == pStack){
printf("malloc error\n");
return NULL;
}
pStack->top = pStack->base = NULL;
pStack->height = 0;
return pStack;
}
/*
** @brief 把数据压入栈内
**
** @param ls 压入栈的数据value
**
** @return 成功ture 失败false
*/
bool push(stackHead *ls,int value)
{
if(ls->top == NULL && ls->top != ls->base){
printf("push param error\n");
return false;
}
stackNode *pNode = (stackNode *)malloc(sizeof(stackNode));
if(NULL == pNode){
printf("push malloc error\n");
return false;
}
pNode->pNext = ls->top;
pNode->data = value;
ls->top = pNode;
ls->height++;
return true;
}
/*
** @brief 把数据压入栈内
**
** @param ls
**
** @return 成功ture 失败false
*/
bool pop(stackHead *ls)
{
if(ls->top == NULL ){
printf("top param error\n");
return false;
}
stackNode *pNode = ls->top->pNext;
free(ls->top);
ls->top = pNode;
ls->height--;
return true;
}
/*
** @brief 打印栈内数据
**
** @param ls
**
** @return 成功ture 失败false
*/
bool printSatck(stackHead *ls)
{
if(ls->top == NULL ){
printf("print param error\n");
return false;
}
while(NULL != ls->top)
{
printf("ls->top->data = %d\n",ls->top->data);
ls->top = ls->top->pNext;
}
return true;
}
测试函数功能
int main()
{
stackHead * pStack = initStack();
//把几个数据压入栈
push(pStack,1);
push(pStack,2);
push(pStack,3);
//弹出栈顶数据
pop(pStack);
//打印数据
printSatck(pStack);
return 0;
}