栈的数组实现

  1 /*
  2   栈的数组实现
  3 */
  4 
  5 /*接口头文件*/
  6 
  7 typedef int ElementType;
  8 #ifndef _STACK_H
  9 #define _STACK_H
 10 #include <stdbool.h>
 11 struct StackRecord;
 12 typedef struct StackRecord * Stack;
 13 
 14 /*操作集*/
 15 bool IsEmpty( Stack S );
 16 bool IsFull( Stack S );
 17 Stack CreateStack( int MaxElements );
 18 void MakeEmpty( Stack S );
 19 void Push( ElementType X, Stack S );
 20 void Pop( Stack S );
 21 ElementType Top( Stack S );
 22 void DisposeStack( Stack S );
 23 void PrintfStack( Stack S );
 24 
 25 #endif
 26 
 27 
 28 /*接口实现*/
 29 #include <stdio.h>
 30 #include <stdlib.h>
 31 #include "stack.h"
 32 
 33 #define EMPTYTOS ( -1 )        //空栈标志 
 34 #define MinStackSize ( 5 )     //指定栈的最小空间
 35 
 36 /*特定结构体定义*/
 37 struct StackRecord
 38 {
 39     int Capacity;   //栈空间大小
 40     int TopOfStack; //栈顶。当其值为0,则栈为空
 41     ElementType * Array; //存储数据 
 42 };
 43 
 44 /*由MaxElements指定栈的大小*/ 
 45 Stack CreateStack( int MaxElements )
 46 {
 47     Stack S;
 48     
 49     if ( MaxElements < MinStackSize )
 50     {
 51        printf( "Stack is smallr
" );
 52        exit( 1 );
 53     }
 54     S = ( Stack )malloc( sizeof( struct StackRecord ) );
 55     if ( S == NULL )
 56     {
 57        printf( "No Space!!!
" );
 58        exit( 1 );
 59     }
 60     S->Array = ( ElementType )malloc( sizeof( ElementType ) * MaxElements );
 61     if ( S->Array == NULL )
 62     {
 63        printf( "No Space!!!
" );
 64        exit( 1 );
 65     }
 66     S->Capacity = MaxElements;
 67     MakeEmpty( S );
 68     
 69     return S;
 70 }
 71 
 72 void MakeEmpty( Stack S )
 73 {
 74     S->TopOfStack = EMPTYTOS;
 75 }
 76 
 77 bool IsEmpty( Stack S )
 78 {
 79     return S->TopOfStack == EMPTYTOS;
 80 }
 81 
 82 bool IsFull( Stack S )
 83 {
 84     return S->TopOfStack == S->Capacity - 1;
 85 }
 86 
 87 void Push( ElementType X, Stack S )
 88 {
 89     if ( IsFull( S ) )
 90     {
 91        printf( "Stack is full
" );
 92        exit( 1 );
 93     }
 94     else
 95         S->Array[ ++S->TopOfStack ] = X;
 96 }
 97 
 98 void Pop( Stack S )
 99 {
100     if ( IsEmpty( S ) )
101     {
102        printf( "Stack is empty
" );
103        exit( 1 );
104     }
105     else
106         S->TopOfStack--;
107 }
108 
109 ElementType Top( Stack S )
110 {
111     if ( IsEmpty( S ) )
112     {
113        printf( "Stack is empty
" );
114        exit( 1 );
115     }
116     else
117         return S->Array[ S->TopOfStack ];
118 }
119 
120 void DisposeStack( Stack S )
121 {
122     free( S->Array );
123     free( S );
124 }
125 
126 void PrintfStack( Stack S )
127 {
128     if ( IsEmpty( S ) )
129        printf( "No Data
" );
130     else
131         for ( int i = S->TopOfStack; i >=0; i-- )
132             printf( "%3d", S->Array[ i ] );
133             
134     printf( "
" );
135 } 
原文地址:https://www.cnblogs.com/weixia-blog/p/7307411.html