好久不见,前面我们学过了数据结构的顺序栈。今天我们来学习下链式栈的实现,链式栈的话,
还是要利用前面我们实现的链式链表,不知道链式链表的,出门左转,前面就有介绍。
第七个例子,链式栈的实现:
注:把我们先前实现的链式链表的头文件和实现文件包含进来
头文件
#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_
typedef void LinkStack;
LinkStack* LinkStack_Create();
void LinkStack_Destroy(LinkStack* stack);
void LinkStack_Clear(LinkStack* stack);
int LinkStack_Length(LinkStack* stack);
int LinkStack_Push(LinkStack* stack, void* item);
void* LinkStack_Top(LinkStack* stack);
void* LinkStack_Pop(LinkStack* stack);
#endif
我个人有点小小的强迫症,代码尽量要求简洁,所以没有注释,有什么不明白的可以留言。
实现文件
#include "LinkStack.h"
#include "LinkList.h"
#include <malloc.h>
typedef struct tag_LinkStackNode
{
LinkListNode header;
void* node;
}TLinkStackNode;
LinkStack* LinkStack_Create()
{
return LinkList_Create();
}
void LinkStack_Destroy(LinkStack* stack)
{
LinkList_Clear(stack);
LinkList_Destroy(stack);
}
void LinkStack_Clear(LinkStack* stack)
{
while (LinkStack_Length(stack) > 0)
{
LinkStack_Pop(stack);
}
}
int LinkStack_Length(LinkStack* stack)
{
int ret = -1;
ret = LinkList_Length(stack);
return ret;
}
int LinkStack_Push(LinkStack* stack, void* item)
{
TLinkStackNode* node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode));
int ret = (node != NULL) && (item != NULL);
if (ret)
{
node->node = item;
ret = LinkList_Insert(stack, (LinkListNode*)node, 0);
}
return ret;
}
void* LinkStack_Top(LinkStack* stack)
{
void* ret = NULL;
TLinkStackNode* node = (TLinkStackNode*)LinkList_Get(stack, 0);
if (node != NULL)
{
ret = node->node;
}
return ret;
}
void* LinkStack_Pop(LinkStack* stack)
{
void* ret = NULL;
TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete(stack, 0);
if (node != NULL)
{
ret = node->node;
free(node);
}
return ret;
}
这样的炫技在前面顺序栈见过吧!现在还熟悉吗?
测试文件
#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"
int main(int argc, char *argv[])
{
LinkStack* stack = LinkStack_Create();
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int i = 0;
LinkStack_Push(stack, &a);
LinkStack_Push(stack, &b);
LinkStack_Push(stack, &c);
LinkStack_Push(stack, &d);
printf("%d\n",*((int*)LinkStack_Top(stack)));
while (LinkStack_Length(stack) > 0)
{
int* v = (int*)LinkStack_Pop(stack);
printf("%d\n", *v);
}
system("PAUSE");
return 0;
}
好了,链式栈的实现就是这么简单,相信你肯定看得懂,后面我会慢慢更新一些高级数据结构的应用。