这次给大家介绍用单链表实现的栈。
如图

这里介绍双向链表的常用操作:
l 创建栈
l 销毁栈
l 清空栈
l 压栈
l 出栈
l 返回栈顶元素
l 返回栈的大小
代码总分为三个文件:
LinkStack.h : 放置功能函数的声明,以及表的声明
LinkStack.c : 放置功能函数的定义
Main.c : 主函数,使用功能函数完成各种需求,一般用作测试
整体结构图为:

这里详细说下插入压栈,出栈操作和返回栈顶元素操作:
压栈操作:
如图:

出栈操作:
返回栈顶元素:
如图:

如果(表首用作栈顶,表尾用作栈底)时,每次压栈和出栈操作时就不会遍历表,因为两个操作都是在栈顶(表首)进行。
如果(表首用作栈底,表尾用作栈顶)时,每次压栈和出栈操作时都要遍历表。
所以第一种方案较合适。
OK! 上代码:
LinkStack.h :
-
#ifndef _LINKSTACK_H_
-
#define _LINKSTACK_H_
-
-
typedef void LinkStack;
-
-
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
LinkStack.c :
-
#include <malloc.h>
-
#include "LinkList.h"
-
#include "LinkStack.h"
-
-
typedef struct _tag_LinkStackNode
-
{
-
LinkListNode header;
-
void* item;
-
}TLinkStackNode;
-
-
LinkStack* LinkStack_Create()
-
{
-
return LinkList_Create();
-
}
-
-
void LinkStack_Destroy(LinkStack* stack)
-
{
-
LinkStack_Clear(stack);
-
-
LinkList_Destroy(stack);
-
}
-
-
void LinkStack_Clear(LinkStack* stack)
-
{
-
while(LinkStack_Size(stack) > 0)
-
{
-
LinkStack_Pop(stack);
-
}
-
}
-
-
int LinkStack_Push(LinkStack* stack, void* item)
-
{
-
TLinkStackNode* node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode));
-
-
int ret = (NULL!=node) && (NULL!=item) && (NULL!=stack);
-
-
if(ret)
-
{
-
node->item = item;
-
-
ret = LinkList_Insert(stack, (LinkListNode*)node, 0);
-
}
-
-
if(!ret)
-
{
-
free(node);
-
}
-
-
return ret;
-
}
-
-
void* LinkStack_Pop(LinkStack* stack)
-
{
-
TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete(stack, 0);
-
-
void* ret = NULL;
-
-
if(NULL!=node)
-
{
-
ret = node->item;
-
-
free(node);
-
}
-
-
return ret;
-
}
-
-
void* LinkStack_Top(LinkStack* stack)
-
{
-
TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete(stack, 0);
-
-
void* ret = NULL;
-
-
if(NULL!=node)
-
{
-
ret = node->item;
-
}
-
-
return ret;
-
}
-
-
int LinkStack_Size(LinkStack* stack)
-
{
-
return LinkList_Length(stack);
-
}
Main.c :
-
#include <stdio.h>
-
#include "LinkStack.h"
-
-
int main(void)
-
{
-
LinkStack* stack = LinkStack_Create();
-
-
int a[10];
-
int i = 0;
-
-
for(i=0; i<10; i++)
-
{
-
a[i] = i;
-
-
LinkStack_Push(stack, a+i);
-
}
-
-
printf("Top: %d\n", *(int*)LinkStack_Top(stack));
-
printf("Length: %d\n", LinkStack_Size(stack));
-
-
while(LinkStack_Size(stack) > 0)
-
{
-
printf("%d \n", *(int*)LinkStack_Pop(stack));
-
}
-
-
LinkStack_Destroy(stack);
-
-
return 0;
-
}