栈的链式存储
- 链式存储,也就相当于一个链表,只不过写的API满足栈的要求:先进后出
代码实例
stack.h
#ifndef __STACK_H
#define __STACK_H
typedef struct LISTNODE //节点
{
struct LISTNODE* next;
}List_Node;
typedef struct STACK//链表的维护信息
{
List_Node* head;
int size;
}Stack;
Stack* Init_Stack(void);
void Push_Stack(Stack* stack,List_Node* data);
void Pop_Stack(Stack* stack);
List_Node* Top_Stack(Stack* stack);
void Clear_Stack(Stack* stack);
void Free_Stack(Stack* stack);
int Size_Stack(Stack* stack);
#endif
stack.c
#include "../include/stack.h"
#include <stdlib.h>
Stack* Init_Stack(void)
{
Stack* stack = (Stack*)malloc(sizeof(Stack));
stack->size =0;
stack->head=(List_Node*)malloc(sizeof(List_Node));
stack->head->next=NULL;
return stack;
}
void Push_Stack(Stack* stack,List_Node* data)
{
if(stack == NULL) return;
if(data == NULL) return;
data->next = stack->head->next;
stack->head->next = data;
stack->size ++;
}
void Pop_Stack(Stack* stack)
{
if(stack == NULL) return;
if(stack->size == 0) return;
stack->head->next =stack->head->next->next;
stack->size--;
}
List_Node* Top_Stack(Stack* stack)
{
if(stack == NULL)return NULL;
if(stack->size == 0) return NULL;
return stack->head->next;
}
void Clear_Stack(Stack* stack)
{
if(stack == NULL)return;
stack->head->next=NULL;
}
void Free_Stack(Stack* stack)
{
if(stack == NULL)
return;
free(stack);
}
int Size_Stack(Stack* stack)
{
return stack->size;
}
main.c
#include <stdio.h>
#include <string.h>
#include "../include/stack.h"
typedef struct PERSION
{
List_Node* node;
char name [64];
int id;
}Person;
int main(void)
{
Stack* stack = Init_Stack();
Person p1,p2,p3,p4;
strcpy(p1.name,"julian");
strcpy(p2.name,"july");
strcpy(p3.name,"mike");
strcpy(p4.name,"kerr");
p1.id = 1;
p2.id = 2;
p3.id = 3;
p4.id = 4;
Push_Stack(stack,(List_Node*)&p1);
printf("Push %s %d\n",p1.name,p1.id);
Push_Stack(stack,(List_Node*)&p2);
printf("Push %s %d\n",p2.name,p2.id);
Push_Stack(stack,(List_Node*)&p3);
printf("Push %s %d\n",p3.name,p3.id);
Push_Stack(stack,(List_Node*)&p4);
printf("Push %s %d\n",p4.name,p4.id);
printf("stack size: %d \n\n",stack->size);
printf("开始Pop\n");
while(stack->size)
{
Person* p =(Person*) Top_Stack(stack);
printf("%s %d\n",p->name,p->id);
Pop_Stack(stack);
}
printf("after pop 4 times size: %d \n\n",stack->size);
Free_Stack(stack);
return 0;
}
结果: