link_stack.h
#ifndef __LINK_STACK_H_
#define __LINK_STACK_H_
typedef struct node{
int num;
struct node* p_next;
}node;
typedef struct
{
node head,tail;//头节点,尾节点
}stack;
//栈的初始化
void stack_init(stack *);
//清理站的存储区
void stack_deinit(stack *);
//判断栈是不是满了
int stack_full(const stack *);
//判断栈是不是空的
int stack_empty(const stack *);
//获得栈里有效数字的个数
int stack_size(stack *);
//向栈里放一个数字
void stack_push(stack *,int);
//从栈里获得下一个数字
int stack_pop(stack *);
//从栈里获得下一个数字
int stack_top(stack *);
#endif
link_stack.cpp
#include "link_stack.h"
#include "stdlib.h"
//栈的初始化
void stack_init(stack *p_stack)
{
p_stack->head.p_next = &(p_stack->tail);//头节点和尾节点绑定
}
//清理站的存储区
void stack_deinit(stack *p_stack)
{
node *p_node = NULL,*p_tmp = NULL;
while(p_stack->head.p_next != &(p_stack->tail))//头节点不等于尾节点时,存在有效节点
{
node* p_first = &(p_stack->head);
node* p_mid = p_first->p_next;
node* p_last = p_mid->p_next;
p_first->p_next = p_last;
free(p_mid);
p_mid = NULL;
}
}
//判断栈是不是满了
int stack_full(const stack *p_stack)
{
return 0;//链式结构不会满,直接返回0
}
//判断栈是不是空的
int stack_empty(const stack *p_stack)
{
return p_stack->head.p_next == &(p_stack->tail);//头节点等于尾节点时为空
}
//获得栈里有效数字的个数
int stack_size(stack *p_stack)
{
node* p_node = NULL;
int size = 0;
for (p_node = &(p_stack->head);p_node != &(p_stack->tail);p_node = p_node->p_next)
{
node* p_first = p_node;
node* p_mid = p_first->p_next;
node* p_last = p_mid->p_next;
if(p_mid != &(p_stack->tail))//有效节点不是尾节点时
{
size++;
}
}
return size;
}
//向栈里放一个数字
void stack_push(stack *p_stack,int num)
{
node *p_node = NULL,*p_tmp = NULL;
p_tmp = (node*)malloc(sizeof(node));
if (!p_tmp)
{
return;
}
p_tmp->num = num;
for (p_node = &(p_stack->head);p_node != &(p_stack->tail);p_node = p_node->p_next)
{
node* p_first = p_node;
node* p_mid = p_first->p_next;
node* p_last = p_mid->p_next;
if (p_mid == &(p_stack->tail))//有效节点等于尾节点,在尾节点处插入。
{
p_first->p_next = p_tmp;
p_tmp->p_next = p_mid;
break;
}
}
}
//从栈里获得下一个数字
int stack_pop(stack *p_stack)
{
node* p_node = NULL;
int num = 0;
for (p_node = &(p_stack->head);p_node != &(p_stack->tail);p_node = p_node->p_next)
{
node* p_first = p_node;
node* p_mid = p_first->p_next;
node* p_last = p_mid->p_next;
if (p_last == &(p_stack->tail))//有效节点的下一个节点是尾节点时,返回当前有效节点
{
p_first->p_next = p_last;
num = p_mid->num;
free(p_mid);
p_mid = NULL;
return num;
}
}
return -1;
}
//从栈里获得下一个数字
int stack_top(stack *p_stack)
{
node* p_node = NULL;
for (p_node = &(p_stack->head);p_node != &(p_stack->tail);p_node = p_node->p_next)
{
node* p_first = p_node;
node* p_mid = p_first->p_next;
node* p_last = p_mid->p_next;
if (p_last == &(p_stack->tail))//获取当前有效节点数字
{
return p_mid->num;
}
}
return -1;
}
main.cpp#include "stdio.h"
#include "link_stack.h"
int main()
{
stack stk = {0};
stack_init(&stk);
stack_push(&stk,1);
stack_push(&stk,3);
stack_push(&stk,5);
stack_push(&stk,7);
stack_push(&stk,25);
printf("数字个数是:%d\n",stack_size(&stk));
printf("判断的结果是:%d\n",stack_full(&stk));
printf("top结果是:%d\n",stack_top(&stk));
printf("pop结果是:%d\n",stack_pop(&stk));
printf("pop结果是:%d\n",stack_pop(&stk));
printf("pop结果是:%d\n",stack_pop(&stk));
printf("pop结果是:%d\n",stack_pop(&stk));
printf("pop结果是:%d\n",stack_pop(&stk));
printf("判断空的结果是:%d\n",stack_empty(&stk));
stack_deinit(&stk);
}