一步一步学数据结构之1--1(栈--单链表实现)

来源:互联网 发布:圣剑神域全套完整源码 编辑:程序博客网 时间:2024/06/08 22:56

 

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

如图

 

这里介绍双向链表的常用操作:

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;}