重学数据结构003——栈的基本操作及实现(链式存储)
来源:互联网 发布:养成类游戏源码 编辑:程序博客网 时间:2024/05/17 23:53
1.栈的概念
展示只允许在其一端进行插入语删除操作的表。从定义上来说,栈其实也是线性表,因此栈也具备大多数线性表所具备的基本操作。但是,从定义上可知,栈在进行插入、删除操作时,只能在一端进行操作,这一端成为栈顶(top)。
栈最核心的操作主要是:进栈(Push)、出栈(Pop)、返回栈顶元素(Top)。 此外,栈还判断栈是否为空、创见栈、清空栈等操作。
既然是线性表,那么栈从实现方式来说主要有两种:顺序存储实现(数组)、链式存储实现(链表)。下面是链式存储实现方式下,站的数据结构定义:
- typedef struct Node *PtrToNode;
- typedef PtrToNode Stack;
- typedef struct Node
- {
- int Element;
- PtrToNode Next;
- };
站的基本操作如下:
- //判断栈是否为空
- int IsEmpty(Stack S);
- //创见栈
- Stack CreateStack();
- //销毁栈
- void DisposeStack(Stack S);
- //清空栈
- void MakeEmpty(Stack S);
- //进栈
- void Push(int X,Stack S);
- //返回栈顶元素
- int Top(Stack S);
- //出栈
- void Pop(Stack S);
下面是一个完整的关于栈的基本操作的例子:
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct Node *PtrToNode;
- typedef PtrToNode Stack;
- typedef struct Node
- {
- int Element;
- PtrToNode Next;
- };
- int IsEmpty(Stack S);
- Stack CreateStack();
- void DisposeStack(Stack S);
- void MakeEmpty(Stack S);
- void Push(int X,Stack S);
- int Top(Stack S);
- void Pop(Stack S);
- //判断栈是否为空
- int IsEmpty(Stack S)
- {
- return S->Next == NULL;
- }
- //创建链栈
- Stack CreateStack()
- {
- Stack S = malloc(sizeof(struct Node));
- if(S == NULL)
- {
- printf("No enough memory!");
- return NULL;
- }
- S->Next = NULL;
- MakeEmpty(S);
- return S;
- }
- void MakeEmpty(Stack S)
- {
- if(S == NULL)
- {
- printf("Use CreateStack First!");
- }
- else
- {
- while(!IsEmpty(S))
- {
- Pop(S);
- }
- }
- }
- void Push(int X,Stack S)
- {
- PtrToNode Tmp;
- Tmp = malloc(sizeof(struct Node));
- if(Tmp != NULL)
- {
- Tmp->Element = X;
- Tmp->Next = S->Next;
- S->Next = Tmp;
- }
- else
- {
- printf("Out of space!");
- }
- }
- void Pop(Stack S)
- {
- if(IsEmpty(S))
- {
- printf("The Stack is Empty!");
- }
- else
- {
- PtrToNode Tmp = S->Next;
- S->Next = Tmp->Next;
- free(Tmp);
- }
- }
- int Top(Stack S)
- {
- if(IsEmpty(S))
- {
- printf("The stack is empty!");
- return 0;
- }
- else
- {
- return S->Next->Element;
- }
- }
- int main(void)
- {
- Stack S = CreateStack();
- int i;
- for(i = 0; i < 5; i++)
- {
- Push(i,S);
- }
- while(!IsEmpty(S))
- {
- printf("%d\n",Top(S));
- Pop(S);
- }
- return 0;
- }
- 重学数据结构003——栈的基本操作及实现(链式存储)
- 重学数据结构004——栈的基本操作及实现(数组实现)
- 数据结构 串(链式存储)的基本操作
- 数据结构之自建算法库——二叉树的链式存储及基本运算
- 数据结构之自建算法库——二叉树的链式存储及基本运算
- 集合的链式存储及操作实现
- 链式栈存储实现及操作
- 栈的链式存储结构操作及实现
- 数据结构(二)链表1:链式存储的基本操作
- 数据结构——二叉树的链式存储操作集合
- 数据结构——单向链表的链式存储及实现
- 数据结构——队列的链式存储结构以及实现
- 栈的链式存储及常用操作
- 二叉树的链式存储结构及基本操作
- 【线性表】顺序存储、链式存储的实现及操作
- 第九周项目一C/C++数据结构自建算法库—二叉树的链式存储及基本运算
- 数据结构-链式线性表基本操作实现
- 链式栈的基本操作与实现
- netstat查看端口使用情况(linux)
- python random模块
- [ASP.NET]"对路径的访问被拒绝" 解决办法 .
- UnitySteer
- foreach X list comprehension X c++ X gCC X dsl(desl)
- 重学数据结构003——栈的基本操作及实现(链式存储)
- 自己动手编写触发器
- 优先队列的使用
- 利用ssh传输文件
- 用纯Javascript打造类似NodeJS的模块载入系统
- 一些网站设计原型图 网页设计从纸上开始
- spring3与mybatis3的整合一例
- Win 旗舰版 IIS配制
- 酒店业与BlackBerry黑莓