1链栈
运行结果如下:
1.1栈结点结构体定义
/*定义一个数据结构*/
typedef struct student
{
char name[32];
char sex;
int age;
}DATA_TYPE;
/*定义一个栈结点*/
typedef struct stack_node
{
DATA_TYPE data;//数据域
struct stack_node *pnext;//指针域
}STACK_NODE;
1.2栈顶结点结构体定义
/*定义一个栈顶结点*/
typedef struct stack_top
{
STACK_NODE *ptop;//栈顶结点指针域
int clen;//栈顶结点数据域-栈结点数
}STACK_TOP;
1.3创建栈顶结点
/*==========创建栈顶结点(创建一个空栈)==========*/
STACK_TOP *create_stack_top(void)
{
STACK_TOP *stack_top=NULL;
/*申请一个栈顶结点空间*/
stack_top=malloc(sizeof(STACK_TOP));
if(NULL==stack_top)
{
perror("fail to malloc");
return NULL;
}
/*栈顶结点成员初始化*/
stack_top->ptop=NULL;
stack_top->clen=0;
return stack_top;
}
1.4创建栈结点
/*==========创建一个新的栈结点==========*/
STACK_NODE *create_stack_new_node(DATA_TYPE data)
{
STACK_NODE *stack_node=NULL;
/*申请一个栈结点空间*/
stack_node=malloc(sizeof(STACK_NODE));
if(NULL==stack_node)
{
perror("fail to malloc");
return NULL;
}
/*栈结点成员初始化*/
stack_node->data=data;
stack_node->pnext=NULL;//思考1:这里直接初始化为NULL,还是继承栈顶的ptop?
return stack_node;
}
1.5判断非空栈
/*==========判断是否为空栈==========*/
int is_empty_stack(STACK_TOP *pstack)
{
return NULL==pstack->ptop;
}
1.6入栈
/*==========入栈-头插法==========*/
int push_stack(STACK_TOP *pstack,STACK_NODE *pnode)
{
#if 0
if (NULL == pstack || NULL == pnode)
{
return -1;
}
#endif
if(is_empty_stack(pstack))
{
pstack->ptop=pnode;//更新栈顶指针域
}
else
{
pnode->pnext=pstack->ptop;//初始化新的栈结点指针域
pstack->ptop=pnode;//更新栈顶指针域
}
pstack->clen++;//更新栈顶结点数据域
return 0;
}
1.7出栈
/*==========出栈-头删法==========*/
int pop_stack(STACK_TOP *pstack,DATA_TYPE *data)
{
STACK_NODE *ptmp=NULL;
#if 0
if(NULL==pstack)
{
return -1;
}
if(is_empty_stack(pstack))
{
return -1;
}
#endif
if(is_empty_stack(pstack))
{
return -1;
}
ptmp=pstack->ptop;//初始化栈结点类型的中间指针变量为栈首
pstack->ptop=ptmp->pnext;//更新栈顶指针域
if(data!=NULL)
{
*data=ptmp->data;//数据出栈,主调函数中定义变量接收出栈数据
}
free(ptmp);
pstack->clen--;
return 0;
}
1.8遍历栈
/*==========遍历栈==========*/
void stack_for_each(STACK_TOP *pstack,void (*pfun)(STACK_NODE *))
{
STACK_NODE *ptmp=NULL;
ptmp=pstack->ptop;//初始化栈结点类型的中间指针变量为栈首
while(1)
{
if(NULL==ptmp)
{
break;
}
pfun(ptmp);
ptmp=ptmp->pnext;
}
}
/*==========遍历方法==========*/
void show_data(STACK_NODE *pnode)
{
printf("%-10s\t%-10c\t%-10d\n",pnode->data.name,pnode->data.sex,pnode->data.age);
}
1.9获取栈顶
/*==========获取栈顶==========*/
int get_stack_top(STACK_TOP *pstack,DATA_TYPE *data)
{
if(is_empty_stack(pstack))
{
return -1;
}
*data=pstack->ptop->data;//栈顶数据出栈
return 0;
#if 0
if(data!=NULL)
{
*data=pstack->ptop->data;
return 0;
}
return -1;
#endif
}
1.10清空栈
/*==========清空栈==========*/
void clear_stack(STACK_TOP *pstack)
{
while(1)
{
if(is_empty_stack(pstack))
{
break;
}
else
{
pop_stack(pstack,NULL);
}
}
}
1.11销毁栈
/*==========销毁栈==========*/
void destroy_stack(STACK_TOP *pstack)
{
clear_stack(pstack);
free(pstack);
}