#ifndef _Stack_H_
#define _Stack_H_
#define OK 0
#define ERROR 1
//栈的节点
typedef struct Stack_Node
{
int data;
struct Stack_Node * next;
}Stack_Node;
//栈的头结点指向栈的顶端值,有了头结点就可以找到整个栈;
typedef struct Stack_Top
{
Stack_Node * top;
}Stack_Top;
Stack_Top * Create_Stack(); //创建栈(通过创建头结点来创建整个栈)返回指向栈的指针,返回值: 0 代表成功 1 代表失败
int Push(Stack_Top * p_stack,int data); //入栈(入栈因为有数据所以要加data)
int Stack_Empty(Stack_Top * p_stack); //查看栈是否为空
int Pop(Stack_Top * p_stack); //出栈(出栈相当于删除,把已有的数据删除掉所以不加data)
int Get_Top(Stack_Top *p_stack); //获得栈顶值(如果有data输入的话就要加上&data,“&”不要忘,因为不加&函数里的data不能返回)
int Destroy(Stack_Top *p_stack); //销毁栈
//只要对栈进行操作(除创建外)都要带入Stack_Top * p_stack
#endif
#include<stdio.h>
#include<stdlib.h>
#include"stack.h"
#include<assert.h>
Stack_Top * Create_Stack()
{
Stack_Top *p_stack = (Stack_Top *)malloc(sizeof(Stack_Top)/sizeof(char));//用malloc创建栈
assert(p_stack); //判断p_stack是否为空,为空报错
if(p_stack == NULL)
{
printf("栈创建失败\n");
return NULL;
}
p_stack->top = NULL;
return p_stack;
}
int Push(Stack_Top * p_stack,int data)
{
assert(p_stack);
Stack_Node * node = (Stack_Node *)malloc(sizeof(Stack_Node)/sizeof(char));//创建栈的节点
assert(node);
node->data = data; //带入数据
node->next = p_stack->top; //头插(新的节点的下一个指向与头结点指向一样)
p_stack->top = node; //之后将头结点指向新的节点
return OK;
}
int Stack_Empty(Stack_Top * p_stack)
{
assert(p_stack);
return (p_stack->top == NULL); //当头结点为空时,则表明栈为空
}
int Pop(Stack_Top * p_stack)
{
assert(p_stack);
if(Stack_Empty(p_stack) == 1)
{
return ERROR; //如果栈为空则不能删除
}
Stack_Node *node = p_stack->top; //当栈不为空时,将栈顶赋给一个node
p_stack->top = node->next; //接着将栈顶的下一个节点变为栈顶
//为什么不用p_stack->top = p_stack->top->next;?因为如果这么做则要放空的部分是p_stack->top之前指向的节点,但那个节点已无法找到,放空不了
free(node); //将节点放空;
node = NULL; //将节点指向空(防止野指针)
return OK;
}
int Get_Top(Stack_Top *p_stack)
{
assert(p_stack);
if(p_stack->top == NULL)
{
return ERROR;
}
printf("%d\n",p_stack->top->data);
return OK;
}
int Destroy(Stack_Top *p_stack)
{
assert(p_stack);
while(!Stack_Empty(p_stack))
{
Pop(p_stack); //销毁栈时,只要栈不为空就从栈顶一个个删除
}
free(p_stack); //最后放空存放栈顶的地址
p_stack = NULL;
return OK;
}
#include<stdio.h>
#include<stdlib.h>
#include"stack.h"
#include<assert.h>
int main()
{
int i = 0;
Stack_Top * p_stack = Create_Stack();
for(i = 0;i < 10;i++)
{
Push(p_stack,i);
}
for(i = 0;i < 10;i++)
{
Pop(p_stack);
Get_Top(p_stack);
}
return 0;
}