一、stack.h
#ifndef __stack_h__
#define __stack_h__
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <Windows.h>
#define Initsize 5
#define Increment 2
typedef int DataType;
typedef struct Stack
{
DataType* _array;
size_t _size;
size_t _capacity;
}Stack;
void StackInit(Stack* s);
void CheckCapacity(Stack* s);
void StackPush(Stack* s, DataType x);
void StackPop(Stack* s);
DataType StackTop(Stack* s);
size_t StackSize(Stack* s);
int StackEmpty(Stack* s);
#endif __stack_h__
二、stack.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "stack.h"
void StackInit(Stack* s)
{
assert(s);
s->_size = 0;
s->_capacity = Initsize;
s->_array = (DataType*)malloc(Initsize*sizeof(DataType));
if (s->_array == NULL)
{
perror("StackInit");
return;
}
memset(s->_array, 0, s->_capacity * sizeof(DataType));
}
void CheckCapacity(Stack* s)
{
assert(s);
if (s->_size >= s->_capacity)
{
DataType* ptr = (DataType*)realloc(s->_array, (s->_capacity + Increment)*sizeof(DataType));
if (ptr == NULL)
{
perror("CheckCapacity");
}
else
{
s->_array = ptr;
s->_capacity += Increment;
}
}
}
void StackPush(Stack* s, DataType x)
{
assert(s);
CheckCapacity(s);
s->_array[s->_size] = x;
s->_size++;
}
void StackPop(Stack* s)
{
assert(s);
if (s->_size == 0)
{
printf("该栈为空\n");
}
else
{
s->_size--;
}
}
DataType StackTop(Stack* s)
{
assert(s);
if (s->_size == 0)
{
printf("该栈为空\n");
return;
}
return s->_array[(s->_size) - 1];
}
size_t StackSize(Stack* s)
{
assert(s);
return s->_size;
}
int StackEmpty(Stack* s)
{
assert(s);
if (s->_size)
{
return 1;
}
else
{
return 0;
}
}