一步一步学数据结构之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;}
- 一步一步学数据结构之1--1(栈--单链表实现)
- 一步一步学数据结构之1--1(单链表)
- 一步一步学数据结构之1--1(队列--单链表实现--含队头尾指针)
- 一步一步学数据结构之1--1(栈--线性表实现)
- 一步一步学数据结构之1--1(队列--两个栈实现)
- 一步一步学数据结构之1--1(栈--两个队列实现)
- 一步一步学数据结构之1--1(队列--线性表实现--不存在循环)
- 一步一步学数据结构之1--1(循环队列--线性表实现)
- 一步一步学数据结构之1--1(队列--单链表表实现--不含队头尾指针)
- 一步一步学数据结构之1--n(二叉树遍历--非递归实现)
- 一步一步学数据结构之1--1(线性表)
- 一步一步学数据结构之1--1(静态链表)
- 一步一步学数据结构之1--1(循环链表)
- 一步一步学数据结构之1--1(双向链表)
- 一步一步学数据结构之1--n(通用树)
- 一步一步学数据结构之1--n(二叉树)
- 小菜一步一步学数据结构之(四)单链表
- 一步一步学数据结构之1--1(双向循环链表)
- hdu 2089 不要62(数位dp入门)
- ORACLE alter system 命令 scope解释
- tomcat链接mysql时超时报错java.io.EOFException: Can not read response from server. Expected to read 4 bytes,
- windows通过vnc连接linux
- sql打开使某一列按照指定数据
- 一步一步学数据结构之1--1(栈--单链表实现)
- 用户登录AD0 0x80040e31
- 关于MFC中窗口最大化
- Codeforces Beta Round #74 (Div. 2 Only) A题
- 展讯 sensor
- Qt: QTextStream流与QDataStream流
- Windows平台下最新Android源码下载
- tomcat应用部署到vps后,发现访问变慢,原来是加载了本来就没有的css文件
- Flex4_HttpService组件