重学数据结构004——栈的基本操作及实现(数组实现)
2011-12-27 18:30
555 查看
上文提到过栈以及栈的基本操作。上文中是基于链表做的实现。但是这种方法会出现大量的malloc()和free()操作,这种开销是非常昂贵的。
另外一种实现方式是基于数组的实现。这种实现方式需要预先制定一个栈的大小,此外还需要一个Top来记录栈顶元素下一个位置的数组索引值。如下图所示:
有的教材将Top指向栈顶元素,也就是上图中X所在的数组单元。我们这里不这么认为。
这种情况下栈的数据结构定义如下:
主要操作如下:
另外一种实现方式是基于数组的实现。这种实现方式需要预先制定一个栈的大小,此外还需要一个Top来记录栈顶元素下一个位置的数组索引值。如下图所示:
有的教材将Top指向栈顶元素,也就是上图中X所在的数组单元。我们这里不这么认为。
这种情况下栈的数据结构定义如下:
typedef struct StackRecord *Stack; struct StackRecord { int Capacity; int Top; int *Array; };
主要操作如下:
//判断栈是否为空 int IsEmpty(Stack S); //判断栈是否已满 int IsFull(Stack S); //创建栈 Stack CreateStack(int MaxElements); //回收栈 void DisposeStack(Stack S); //清空栈 void MakeEmpty(Stack S); //进栈操作 void Push(int X, Stack S); //返回栈顶元素 int Top(Stack S); //出栈操作 void Pop(Stack S); //出栈并且返回栈定元素 int PopAndTop(Stack S); 一个完整的例子代码如下: #include <stdio.h> #include <stdlib.h> #define MIN_STACK_SIZE 5 typedef struct StackRecord *Stack; struct StackRecord { int Capacity; int Top; int *Array; }; //判断栈是否为空 int IsEmpty(Stack S); //判断栈是否已满 int IsFull(Stack S); //创建栈 Stack CreateStack(int MaxElements); //回收栈 void DisposeStack(Stack S); //清空栈 void MakeEmpty(Stack S); //进栈操作 void Push(int X, Stack S); //返回栈顶元素 int Top(Stack S); //出栈操作 void Pop(Stack S); //出栈并且返回栈定元素 int PopAndTop(Stack S); int IsEmpty(Stack S) { return S->Top == 0; } int IsFull(Stack S) { return S->Top == S->Capacity; } void MakeEmpty(Stack S) { S->Top = 0; } Stack CreateStack(int MaxElements) { if(MaxElements < MIN_STACK_SIZE) { fprintf(stderr, "Can't create a Stack less than %d elements\n",MIN_STACK_SIZE); exit(1); } else { Stack S = malloc(sizeof(struct StackRecord)); if(S == NULL) { fprintf(stderr, "Out of space!"); exit(1); } S->Array = malloc(sizeof(int)*MaxElements); S->Capacity = MaxElements; MakeEmpty(S); return S; } } void DisposeStack(Stack S) { if(S != NULL) { free(S->Array); free(S); } } void Push(int X, Stack S) { if(IsFull(S)) { fprintf(stderr,"The Stack Is Full"); } else { //元素先入栈 S->Array[S->Top++] = X; } } int Top(Stack S) { if(!IsEmpty(S)) { int tmp = S->Top - 1; return S->Array[tmp]; } else { fprintf(stderr,"The Stack Is Full"); exit(1); } } void Pop(Stack S) { if(!IsEmpty(S)) { --(S->Top); } else { fprintf(stderr,"The Stack Is Full"); exit(1); } } int PopAndTop(Stack S) { if(!IsEmpty(S)) { return S->Array[--S->Top]; } else { fprintf(stderr,"The Stack Is Full"); exit(1); } } int main(void) { Stack S = CreateStack(10); int i; for(i = 0; i < 10; i++) { Push(i,S); } while(!IsEmpty(S)) { printf("%d ",PopAndTop(S)); } printf("\n"); return 0; }
相关文章推荐
- 重学数据结构004――栈的基本操作及实现(数组实现)
- 重学数据结构003——栈的基本操作及实现(链式存储)
- 数据结构第五次作业(图的基本操作实现)
- [数据结构][C语言]图的基本介绍和操作实现之图的存储结构
- 【数据结构】双向循环线性表的基本操作--C++/C实现
- 数据结构--串的操作基本实现程序代…
- C语言数组实现栈的基本操作,并利用O(1)求出栈中最小元素
- 【数据结构】双向循环线性表的基本操作--C++/C实现
- 【数据结构】二叉树基本操作的程序实现
- 数据结构基础(8) --单链表的设计与实现(1)之基本操作
- 算法与数据结构-堆的基本操作C语言实现
- 实现基于静态数组的顺序表的以下基本操作(进阶部分)
- [C++]数据结构:有序链表SortedChain的基本实现与操作
- 数据结构-链式线性表基本操作实现
- 数据结构-循环队列的基本实现操作
- 数据结构 P62-62 算法实现 单链队列的创建及基本操作
- 数据结构笔记(三)静态链表的实现和基本操作
- 数据结构:二叉树的基本操作(JAVA实现)
- 算法与数据结构-二叉树的基本操作C语言实现
- 【原创】【数据结构】一维树状数组的基本操作(单点修改,区间查询) (HDU1166 敌兵布阵)