用数据模拟栈,在一定的程度上提高了效率。但浪费了一些空间。下面我附上代码:
#include <stdlib.h>
#include <stdio.h>
#define EmptyTOS (-1)
#define MinStackSize (5)
struct StackRecord;
typedef struct StackRecord *Stack;
struct StackRecord
{
int Capacity;
int TopOfStack;
int *Array;
};
/*
* 创建一个stack
*/
Stack CreateStack(int MaxElements)
{
Stack S;
if (MaxElements < MinStackSize)
{
printf("Stack size is too small.\n");
}
S = (Stack)malloc(sizeof(struct StackRecord));
if (S == NULL)
{
printf("out of space!!!\n");
}
S->Array = (int *)malloc(sizeof(int)*MaxElements);
if (S->Array == NULL)
{
printf("out of space !!!\n");
}
S->TopOfStack = -1;
S->Capacity = MaxElements;
// printf("TopOfStack`s value = %d, S->Capacity = %d\n", S->TopOfStack, S->Capacity);
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;
}
/*
* 判断栈是否满
*/
int IsFull(Stack S)
{
if (S->TopOfStack >= S->Capacity)
{
return -1;
}
else
return 0;
}
/*
* push data.
*/
void Push(int X, Stack S)
{
if (IsFull(S))
printf("Full Stack\n");
else
{
S->TopOfStack++;
S->Array[S->TopOfStack] = X;
}
}
/*
* print stack.
*/
void ShowStack(Stack S)
{
int i;
printf("Now we can print the stack.\n");
for (i = 0; i <= S->TopOfStack; i++)
{
if (i < S->TopOfStack)
{
printf("%d, ", S->Array[i]);
}
else
{
printf("%d \n", S->Array[i]);
}
}
}
/*
* 弹出第一个数.
*/
int Top(Stack S)
{
if (IsEmpty(S))
{
return 0;
}
else
{
return S->Array[S->TopOfStack];
}
}
/*
* pop data.
*/
int Pop(Stack S)
{
if (IsEmpty(S))
{
printf("Empty Stack\n");
return 0;
}
else
{
S->TopOfStack --;
}
}
int main(void)
{
Stack Stack1;
Stack1 = CreateStack(10);
Push(2, Stack1);
Push(3, Stack1);
Push(4, Stack1);
Push(5, Stack1);
Pop(Stack1);
ShowStack(Stack1);
return 0;
}