链式栈
1.基本概念
2.设计和实现
#ifndef _MY_LINKSTACK_H_
#define _MY_LINKSTACK_H_
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include "TLinkList.h"
typedef void LinkStack;
typedef struct _tagMyStruct
{
LinkListNode node;
void * item;
}LinkStackNode;
LinkStack* LinkStack_Create();
void LinkStack_Destroy(LinkStack* stack);
void LinkStack_Clear(LinkStack* stack);
int LinkStack_Push(LinkStack* stack, void* item);
void* LinkStack_Pop(LinkStack* stack);
void* LinkStack_Top(LinkStack* stack);
int LinkStack_Size(LinkStack* stack);
#endif
#include "linkstack.h"
#include "TLinkList.h"
LinkStack* LinkStack_Create()
{
return (LinkStack*)LinkList_Create();
}
void LinkStack_Destroy(LinkStack* stack)
{
if (stack == NULL)
{
printf("argv error!\n");
return;
}
LinkStack_Clear(stack);
free(stack);
return ;
}
void LinkStack_Clear(LinkStack* stack)
{
if (stack == NULL)
{
printf("argv error!\n");
return;
}
while (LinkStack_Size(stack) > 0)
{
LinkStack_Pop(stack);
}
return ;
}
int LinkStack_Push(LinkStack* stack, void* item)
{
LinkStackNode * tmp = NULL;
int ret = 0;
tmp = (LinkStackNode *)malloc(sizeof(LinkStackNode));
if (tmp == NULL)
{
return -1;
}
memset(tmp, 0, sizeof(LinkStackNode));
tmp->item = item;
ret = LinkList_Insert((LinkList*)stack, (LinkListNode*)tmp, 0);
if (ret != 0)
{
printf("LinkList_Insert failed!\n");
free(tmp);
}
return ret;
}
void* LinkStack_Pop(LinkStack* stack)
{
LinkStackNode * tmp = NULL;
void * item = NULL;
tmp = (LinkStackNode*)LinkList_Delete((LinkList*)stack, 0);
if (tmp == NULL)
{
printf("fail!\n");
return NULL;
}
item = tmp->item;
free(tmp);
return item;
}
void* LinkStack_Top(LinkStack* stack)
{
LinkStackNode * tmp = NULL;
tmp = (LinkStackNode*)LinkList_Get((LinkList*)stack, 0);
if (tmp == NULL)
{
printf("Top failed!\n");
return NULL;
}
return tmp->item;
}
int LinkStack_Size(LinkStack* stack)
{
return LinkList_Length((LinkList*)stack);
}
#include "linkstack.h"
int main()
{
LinkStack * stack = NULL;
int a[10];
int i = 0;
stack = LinkStack_Create();
if (stack == NULL)
{
printf("create error\n");
return -1;
}
for (i = 0; i < 5;i++)
{
a[i] = i + 1;
LinkStack_Push(stack, (void*)&a[i]);
}
printf("Length : %d\n", LinkStack_Size(stack));
printf("Top : %d\n", *((int *)LinkStack_Top(stack)));
while (LinkStack_Size(stack) > 0)
{
printf("Pop: %d\n", *((int *)LinkStack_Pop(stack)));
}
LinkStack_Destroy(stack);
system("pause");
return 0;
}