这次是用数组来实现栈,实现思路和方法都比较简单,就不多解释了,下面直接上代码:
头文件:
#ifndef STACKCURSOR_H_INCLUDED
#define STACKCURSOR_H_INCLUDED
typedef int ElementType;
typedef struct StackRecord *Stack;
int Isempty(Stack S);
int IsFull(Stack S);
Stack CreatStack(int MaxElements);
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push(ElementType X,Stack S);
ElementType Top(Stack S);
void Pop(Stack S);
ElementType TopAndPop(Stack S);
#endif // STACKCURSOR_H_INCLUDED
实现:
#include "StackCursor.h"
#include <stdlib.h>
#define EmptyTOS (-1)
#define MinStackSize (5)
void Error(char * message)
{
}
void FatalError(char * message)
{
}
struct StackRecord
{
int Capacity;
int TopOfStack;
ElementType * Array;
};
Stack CreatStack(int MaxElements)
{
Stack S;
if(MaxElements < MinStackSize)
Error("Stack size is too Small");
S = malloc( sizeof(struct StackRecord));
if( S == NULL )
FatalError("Out of space!!!");
S->Array = malloc(sizeof(ElementType)*MaxElements);
if(S->Array == NULL)
FatalError("Out of space!!!");
S->Capacity = MaxElements;
MakeEmpty(S);
return S;
}
void DisposeStack(Stack S)
{
if( S != NULL )
{
free(S->Array);
free(S);
}
}
int IsEmpty( Stack S )
{
return S->TopOfStack == EmptyTOS;
}
void MakeEmpty( Stack S )
{
S->TopOfStack = EmptyTOS;
}
void Push( ElementType X,Stack S )
{
if( IsFull(S) )
Error( "Full stack" );
else
S->Array[++S->TopOfStack] = X;
}
ElementType Top(Stack S)
{
if(!IsEmpty( S ))
return S->Array[S->TopOfStack];
Error("Empty stack");
return 0;
}
void Pop(Stack S)
{
if( IsEmpty(S) )
Error("Empty stack");
else
S->TopOfStack--;
}
ElementType TopAndPop(Stack S)
{
if(!IsEmpty(S))
return S->Array[S->TopOfStack--];
Error("Empty stack");
return 0;
}
int IsFull(Stack S)
{
return S->TopOfStack == S->Capacity-1;
}
int main()
{
Stack S = CreatStack(50);
int i;
for(i = 0;i < 20;i++)
Push(i,S);
while(!IsEmpty(S))
{
printf("%d\n",TopAndPop(S));
}
DisposeStack(S);
}
注:代码改编自《数据结构与算法:C语言描述》第二版