栈—数组与链表实现

来源:互联网 发布: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
原创粉丝点击