这次给大家介绍用单链表实现的栈。
如图
这里介绍双向链表的常用操作:
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;
- }