栈—数组与链表实现
来源:互联网 发布:sql维护计划不执行 编辑:程序博客网 时间:2024/05/22 05:25
栈的实现一般由数组与链表实现,但数组实现较为常见,链表实现一般不常用。以下给出两种实现方式的完整代码:
一、数组实现
注意要点:
1. 栈为空时 Top = -1;
2. 栈满时 Top = Capacity;
代码如下:
/* ADT: Stack 存储结构:数组*/struct StackRecord;typedef StackRecord *Stack;struct StackRecord{int Capacity; // 栈的容量int TopOfStack;ElementType *Array;};#define EmptyTOS ( -1 )#define MinStackSize ( 5 )Stack CreatStack( int MaxElements );int IsEmpty( Stack S );int IsFull( Stack S );void MakeEmpty( Stack S );void Dispose( Stack S );void Push( ElementType X, Stack S );void Pop( Stack S );ElementType Top( Stack S );ElementType TopAndPop( Stack S );/* 基本操作实现 */Stack CreatStack(int MaxElements){// 初始条件:输入栈的容量// 操作结果:创建并返回一个最大容量为Max_Element的空栈Stack S;if ( MaxElements< MinStackSize )printf("Stack size is too small!!!");S = (Stack) malloc( sizeof(struct StackRecord) );if ( NULL == S ){printf( "Out of sapce!!!" );return NULL;}S->Array =( ElementType * )malloc( sizeof(ElementType) * MaxElements );if ( NULL == S->Array ){printf( "Out of Space!!!" );return NULL;}S->Capacity = MaxElements;MakeEmpty( S );return S;}void DisposeStack( Stack S ){// 操作结果:删除栈if ( S != NULL ){free( S->Array );free( S );}}int IsEmpty( Stack S ){// 操作结果:判断栈是否为空栈// EmptyTos为一个值,栈为空时TopOfStack = EmptyTOS; return S->TopOfStack == EmptyTOS; }int IsFull( Stack S ){// 操作结果:判断栈是否满return S->TopOfStack == S->Capacity;}void MakeEmpty( Stack S ){// 操作结果:设置Top指针为0,清空栈S->TopOfStack = EmptyTOS;}void Push( ElementType X, Stack S ){// 操作结果:栈未满时将数据元素X进栈if ( IsFull(S) )printf( "Full Stack" );else{S->TopOfStack++;S->Array[S->TopOfStack] = X;}}void Pop( Stack S ){// 操作结果:若栈不为空,顶端元素出栈if ( IsEmpty(S) )printf( "Empty Stack" );elseS->TopOfStack--;}ElementType Top(Stack S){// 操作结果:返回栈顶元素的值if ( IsEmpty(S) ){printf( "Empty Stack" );return 0; /* return value used to avoid warming */}elsereturn S->Array[S->TopOfStack];}ElementType TopAndPop( Stack S ){if ( IsEmpty(S) ){printf( "Empty Stack" );return 0; /* return value used to avoid warming */}elsereturn S->Array[S->TopOfStack--];}
链表实现时以Top为头指针,指向带头结点单链表的头结点,Push、Pop等操作在表头完成。
当 Top->Next = NULL时栈为空。
代码如下:
/* ADT: 栈实现:带头结点的单链表*/struct Node;typedef struct Node *PtrToNode;typedef PtrToNode Stack;struct Node{ElementType Element;PtrToNode Next;};/* 基本操作 */Stack CreatStack( );void DisposeStack( Stack S );int IsEmpty( Stack S );void MakeEmpty( Stack S );void Push( ElementType X, Stack S );void Pop( Stack S );ElementType Top( Stack S );Stack CreatStack( ){// 操作结果:返回空栈Stack S;S = ( Stack )malloc( sizeof(struct Node) );if ( NULL == S ){printf("Out of Space!!!");return NULL;}S->Next = NULL;MakeEmpty( S );return S;}void DisposeStack( Stack S ){// 操作结果:删除栈if ( S !== NULL ){ MakeEmpty( S ); free( S );}}int IsEmpty( Stack S ){// 操作结果:判断栈是否为空return NULL == S->Next;}void MakeEmpty( Stack S ){// 操作结果:清空栈if ( NULL == S )printf("Must create stack first!");else while ( !IsEmpty(S) ) Pop( S );}void Push( ElementType X, Stack S ){// 操作结果:使元素X入栈PtrToNode TmpCell;TmpCell = ( PtrToNode) malloc( sizeof(struct Node) );if ( NULL == TmpCell ){printf("Out of space!!!");return;}TmpCell->Element = X;TmpCell->Next = S->Next;S->Next = TmpCell;}void Pop( Stack S ){// 操作结果:若栈不为空,则使顶端元素出栈PtrToNode FirstCell;if ( IsEmpty(S) )printf("Empty Stack");else{FirstCell = S->Next;S->Next = FirstCell->Next;free( FirstCell );}}ElementType Top( Stack S ){// 操作结果:若栈不为空,则返回栈顶元素if ( !IsEmpty(S) )return S->Next->Element;printf( "Empty Stack" );return 0;}
0 0
- 栈—数组与链表实现
- 栈的链表实现 与 数组实现
- 栈的数组实现与链表实现
- 栈的实现(数组与链表实现)
- java 队列与栈实现(链表与数组)
- 栈、队列、背包的数组与链表实现
- 队列—链表与循环数组实现
- 队列的链表与数组实现
- 约瑟夫环 数组与链表实现
- 链表的实现与数组
- 《数据结构与算法分析》—栈的链表和数组实现(C语言)
- 队列的数组实现与链表实现
- ⚔疯狂输出⚔ 数组实现与链表实现
- 队列——链表与数组实现(数据结构与算法分析C语言版)
- 两个一元多项式相乘,数组与链表实现
- 算法与数据结构 其二 数组和链表 的实现
- 数据结构与算法学习笔记——链表部分实现(数组形式)
- Java栈实现:数组实现和链表实现
- Hadoop 高级程序设计(一)---复合键 自定义输入类型
- 实战:oracle新建表空间的shell脚本
- spring 的OpenSessionInViewFilter简介
- 华为字符串压缩程序
- Android Property Animation动画
- 栈—数组与链表实现
- AndroidResideMenu
- 有关spring面试的一些问题-IoC和AOP的理解
- SQL SERVER2008超时问题,求大神解答
- C++创建二维数组和矩阵
- TranslateAnimation
- 解决 vmware kernel module updater 问题
- IOS开源库一览表
- [每日练习]面试题--判断某个字符串是否为另一个字符串旋转得到的(Java)