数据结构(C实现)------- 链栈
来源:互联网 发布:达观数据公司简介 编辑:程序博客网 时间:2024/06/05 10:05
描述:
链栈,即栈的链式存储结构,链栈通常使用不带头结点的单链表来表示,因此其结点的结构和单链表的结点结构相同。
在一个链栈中,栈底就是链表的最后一个结点,而栈顶总是链表的第一个结点。因此,新入栈的元素即为链表中采用头插法新加入的结点,一个链栈可以由栈顶指针唯一确定,当top为NULL时,则表示该栈是一个空的链栈。
实现:
链栈结点的类型描述:
typedef int ElemType;typedef struct node{ElemType data;struct node *next;}LinkNode,*LinkStack;
基本操作
1. 初始化链栈Init_LinkStack()
链栈的初始化操作就是创建一个不带头结点的空的单链表,如下:
//初始化链栈LinkStack Init_LinkStack(){LinkStack S;S = NULL;return S;}
2. 判断链栈空IsEmpty_LinkStack(LinkStack top)
根据定义,当栈顶指针top为NULL时,表示该结点为一个空栈,返回1,否则,则返回0 。
//判断链栈空int IsEmpty_LinkStack(LinkStack top){if(top == NULL)return 1;elsereturn 0;}
3. 入链栈Push_SqStack(SqStack* S,ElemType x)
入栈,即向栈中插入一个元素作为新的栈顶元素,首先要动态申请一个结点作为新元素的存储空间,然后将新数据元素写入申请的存储空间中,并将栈顶指针top的值写入新结点中的指针域,最后将栈顶指针指向新插入的结点,代码如下:
//入栈操作void Push_SqStack(SqStack* S,ElemType x){//栈满,则退出if(isFull_SqStack(S)){printf("栈满!\n");exit(0);}else{S->data[++(S->top)] = x;}}
4. 出链栈Pop_SqStack(SqStack* S,ElemType* x)
出栈,即从栈中输出一个元素,并将其删除,具体过程为:当栈顶元素出栈时,先判断栈顶指针是否为空,如果空,则输出提示信息并退出,否则,取出栈顶元素的值返回,然后,将栈顶指针向后移动,并且释放掉被删除栈顶元素的存储空间。
//出栈void Pop_SqStack(SqStack* S,ElemType* x){//如果栈空,则输出提示信息,并退出if(isEmpty_SqStack(S)){printf("栈空!\n");exit(0);}else*x = S->data[S->top--];}
5. 读取链栈顶元素Top_SqStack(SqStack* S,ElemType* x)
读取链栈顶元素与出栈不同,二者的区别在于:读取栈顶元素时,栈顶指针不发生变化,仅取得栈顶元素的值;而出栈则还要将栈顶元素删除,在此时栈顶指针也要发生变化;但二者都要判断栈是否为空。
//读取栈顶元素void Top_SqStack(SqStack* S,ElemType* x){if(isEmpty_SqStack(S)){printf("栈空!\n");exit(0);}else *x = S->data[S->top];}
6. 输出栈中所有的元素Print_SqStack(SqStack* S)
从栈顶开始遍历整个链栈,输出所有的元素,同样,需要判断链栈是否为空。
//输出整个栈void Print_SqStack(SqStack* S){if(isEmpty_SqStack(S)){printf("栈空!\n");exit(0);}int length = S->top;while(length > -1)printf("%d\t",S->data[length--]);printf("\n");}
说明:
以上只是链栈最基本的操作,当然了,在实际应用中,往往不仅涉及入栈和出栈等操作,而且还需要对非栈顶的元素进行访问。
顺序栈和链栈的比较:
1. 顺序栈易于根据栈顶指针的位置进行相对位移,快速定位并读取栈的内部元素,因此,顺序栈比链栈应用更广泛。
2. 顺序栈读取内部元素的时间复杂度为O(1),链栈读取内部元素的时间复杂度为O(n),其中,n为链栈的长度。
- 数据结构(C实现)------- 链栈
- 数据结构(C实现)------- 单链表
- 数据结构(C实现)------- 串
- 数据结构-Vector实现(C++)
- 【数据结构】实现单链表(c++)
- 数据结构(栈)c/c++/java实现
- 数据结构 - 链栈(C)
- 【数据结构】数据结构C语言的实现(线性表)
- 【数据结构】数据结构C语言的实现(单链表)
- 【数据结构】数据结构C语言的实现(栈)
- 【数据结构】数据结构C语言的实现(队列)
- 【数据结构】数据结构C语言的实现(简单二叉树)
- 数据结构堆栈实现(C版本)
- 清华大学出版社 数据结构(C语言版)的实现
- 数据结构:队列(C语言实现)
- 数据结构(C语言)实现循环队列
- 数据结构实现链式队列(C语言)
- 数据结构之单链表实现栈(C++)
- Codeforces Round #268 (Div. 2) C
- 2014 ACM/ICPC Asia Regional Guangzhou Online HDU 5024 Wang Xifeng's Little Plot
- CF 268C 24 Game
- C语言中的零长度数组使用说明
- HTML5推箱子机理实现
- 数据结构(C实现)------- 链栈
- OpenSSL RSA 用法
- 谈谈C++类型安全
- AOP技术应用和研究
- hdu 1711(kmp)
- 设计模式-缓存工厂模式代码构造
- Ubuntu上安装gem包时报`require': cannot load such file -- openssl (LoadError)
- spring中遇到的applicationContext.xml (系统找不到指定的文件。)
- 【实例】表格多选例子