小猪的数据结构辅助教程——3.2 栈与队列中的链栈
来源:互联网 发布:sql insert select 编辑:程序博客网 时间:2024/04/24 23:07
小猪的数据结构辅助教程——3.2 栈与队列中的链栈
标签(空格分隔): 数据结构
1.本节引言:
嗯,本节没有学习路线图哈,因为栈我们一般都用的是顺序栈,链栈还是顺带提一提吧,
栈因为只是栈顶来做插入和删除操作,所以较好的方法是将栈顶放在单链表的头部,栈顶
指针与单链表的头指针合二为一~所以本节只是讲下链栈的存储结构和基本操作!
2.链栈的存储结构与示意图
存储结构:
typedef struct StackNode{ SElemType data; //存放的数据 struct StackNode *next;}StackNode,*LinkStackPtr;typedef struct LinkStack{ LinkStackPtr top; //Top指针 int count; //栈元素计数器}LinkStack;
示意图:
由上图可以发现一点,链栈不会出现栈满的情况…
3.链栈基本操作的代码实现
代码实现:
#include <stdio.h>#define STACK_INIT_SIZE 10 //存储空间的初始分配量#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int Status; typedef int SElemType;//存储结构 typedef struct StackNode{ SElemType data; //存放的数据 struct StackNode *next;}StackNode,*LinkStackPtr;typedef struct LinkStack{ LinkStackPtr top; //Top指针 int count; //栈元素计数器}LinkStack;//1.构建一个空栈Status InitStack(LinkStack *S){ S ->top = (LinkStackPtr)malloc(sizeof(StackNode)); if(!S ->top)return ERROR; S ->top = NULL; S ->count = 0; return OK;} //2.将栈置空Status ClearStack(LinkStack *S){ LinkStackPtr p,q; p = S->top; while(p) { q = p; p = p ->next; free(q); } S ->count = 0; return OK; }//3.判断栈是否为空Status StackEmpty(LinkStack S){ return S.count == 0?TRUE:FALSE;}//4.获得栈中的元素个数int StackLength(LinkStack S){ return S.count;}//5.获得栈顶元素Status GetTop(LinkStack *S,SElemType *e){ LinkStackPtr p; if(StackEmpty(*S))return ERROR; *e = S ->top->data; p = S ->top; return OK;}//6. 往链栈中插入元素(入栈)Status PushStack(LinkStack *S,SElemType e){ LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode)); if(!s)return ERROR; s ->data = e; s ->next = S ->top; S ->top = s; S ->count++; return OK;} //7.删除栈顶元素*出栈( Status PopStack(LinkStack *S,SElemType *e) { LinkStackPtr p; if(StackEmpty(*S))return ERROR; * e = S ->top ->data; p = S ->top; //获取栈顶结点 S ->top = S ->top ->next; //栈顶指针下移一位 free(p); //释放结点p S ->count--; return OK;}//8.遍历栈Status StackTraverse(LinkStack S){ LinkStackPtr p; p = S.top; while(p) { visit(p->data); p=p->next; } printf("\n"); return OK; } //定义一个打印元素的方法 Status visit(SElemType c){ printf("%d ",c); return OK;}int main(){ int i,e; LinkStack s; InitStack(&s); printf("初始化链栈,接着插入10个元素~\n"); for(i = 1;i <= 10;i++) { PushStack(&s,i); } printf("此时栈中的元素依次为:\n"); StackTraverse(s); printf("此时栈中有%d个元素\n",StackLength(s)); PopStack(&s,&e); printf("出栈,出栈结点为:%d\n",e); printf("此时栈中的元素依次为:\n "); StackTraverse(s); ClearStack(&s); printf("清空栈,此时栈中有%d个元素!\n\n",StackLength(s)); return 0;}
运行结果:
代码比较简单,就不解释了~
4.本节代码下载:
https://github.com/coder-pig/Data-structure-auxiliary-tutorial/blob/master/Stack/Stack3.c
2 0
- 小猪的数据结构辅助教程——3.2 栈与队列中的链栈
- 小猪的数据结构辅助教程——3.1 栈与队列中的顺序栈
- 小猪的数据结构辅助教程——2.3 线性表中的静态链表
- 小猪的数据结构辅助教程——2.4 线性表中的循环链表
- 小猪的数据结构辅助教程——2.7 线性表中的双向循环链表
- 小猪的数据结构辅助教程——3.3 栈的应用实例:逆波兰式(RPN)
- 小猪的数据结构辅助教程——1.数据结构与算法绪论
- 小猪的数据结构辅助教程——前言
- 小猪的数据结构辅助教程——2.1 线性表中的顺序表
- 小猪的数据结构辅助教程——2.2 线性表中的单链表
- 小猪的数据结构辅助教程——2.5 经典例子:约瑟夫问题的解决
- 小猪的数据结构辅助教程——2.6 经典例子:魔术师发牌问题和拉丁方阵问题
- 【栈与队列】SDUT练习1—传说中的数据结构
- 数据结构的栈与队列
- 数据结构——栈与队列(顺序栈、链栈、循环队列、链队列)
- 数据结构入门——栈与队列
- 数据结构——栈与队列
- 数据结构学习——栈与队列
- [Android]eclipse window菜单下没有android sdk manager
- 随机数
- LeetCode114 Flatten Binary Tree to Linked List
- unity与3DMax的单位问题
- JVM参数配置
- 小猪的数据结构辅助教程——3.2 栈与队列中的链栈
- Java8中 局部内部类访问的局部变量不必用final修饰
- Maven + Spring MVC+Mybatis + MySQL +AngularJS + Bootstrap 实现简单微博应用(一)环境搭建
- Android Studio使用
- git reset 和 git revert 的区别
- 数据结构基础(三)广义表
- LeetCode-35-Search Insert Position(二分法)-Medium
- jquery 数组 添加元素
- 机器人走路爱碰壁?Slamtec要用激光雷达让它们“识路”