重学数据结构003――栈的基本操作及实现(链式存储)
2011-11-14 12:40
447 查看
1.栈的概念
展示只允许在其一端进行插入语删除操作的表。从定义上来说,栈其实也是线性表,因此栈也具备大多数线性表所具备的基本操作。但是,从定义上可知,栈在进行插入、删除操作时,只能在一端进行操作,这一端成为栈顶(top)。
栈最核心的操作主要是:进栈(Push)、出栈(Pop)、返回栈顶元素(Top)。 此外,栈还判断栈是否为空、创见栈、清空栈等操作。
既然是线性表,那么栈从实现方式来说主要有两种:顺序存储实现(数组)、链式存储实现(链表)。下面是链式存储实现方式下,站的数据结构定义:
站的基本操作如下:
下面是一个完整的关于栈的基本操作的例子:
本文出自 “wawlian说” 博客,请务必保留此出处http://wawlian.blog.51cto.com/242845/713658
展示只允许在其一端进行插入语删除操作的表。从定义上来说,栈其实也是线性表,因此栈也具备大多数线性表所具备的基本操作。但是,从定义上可知,栈在进行插入、删除操作时,只能在一端进行操作,这一端成为栈顶(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;
}
本文出自 “wawlian说” 博客,请务必保留此出处http://wawlian.blog.51cto.com/242845/713658
相关文章推荐
- 线性表链式存储结构下基本操作的实现(初始化、赋值、取值、插入、删除、归并等)
- 栈的链式存储 c实现的几种基本操作
- 数据结构(二)链表1:链式存储的基本操作
- 二叉树(二叉链式存储)8种基本操作的实现
- 二叉树基本操作实现(二叉树的链式存储)
- 重学数据结构003——栈的基本操作及实现(链式存储)
- 基本数据类型,String、Integer等封装类,以及Class,三者在内存中是怎么存储的?对它们的操作机制又是什么样的?
- 数据结构之队列的基本操作入队出队初始化删除-c++代码实现及运行实例结果
- MongoDB 通过samus驱动实现基本数据操作
- 图的邻接矩阵存储结构基本操作的实现
- android笔记-android基本操作和数据存储
- 实验2.2 运用单链表实现对数据的基本操作
- 数据结构之队列定义及基本操作实现
- mysql 基本操作 数据类型、常用函数、存储引擎特点 (第二章)
- 栈的基本操作(链式存储)链栈
- 数据结构之队列的基本操作入队出队初始化删除-c++代码实现及运行实例结果
- 数据结构-队列的链式存储实现操作
- 前端通过AJAX提交数据,后台PHP处理数据实现异步操作基本流程
- 数据结构(C语言实现) - 二叉树的基本操作(建立,遍历,结点数,叶子结点数,高度,按树状打印,输出叶子结点等)
- 数据结构之二叉排序树(基于指针实现基本操作)