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