#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define INIT_SIZE 10
typedef int ELEMTYPE;
typedef struct Stack
{
ELEMTYPE* base;
int top;
int stacksize;
}Stack, * PStack;
void Init_stack(PStack ps);
bool Push(PStack ps, ELEMTYPE val);
bool Pop(PStack ps, ELEMTYPE* rtval);
bool Top(PStack ps, ELEMTYPE* rtval);
int Get_length(PStack ps);
bool IsEmpty(PStack ps);
bool IsFull(PStack ps);
static void Inc(PStack ps);
void Clear(PStack ps);
void Destory(PStack ps);
void Show(PStack ps);
#include"stack.h"
#include <malloc.h>
void Init_stack(PStack ps)
{
assert(ps != NULL);
if (NULL == ps)return;
ps->base = (ELEMTYPE*)malloc(sizeof(ELEMTYPE) * INIT_SIZE);
if (ps->base == NULL)exit(1);
ps->stacksize = INIT_SIZE;
ps->top = 0;
}
bool Push(PStack ps, ELEMTYPE val)
{
assert(ps != NULL);
if (IsFull(ps))
{
Inc(ps);
}
ps->base[ps->top] = val;
ps->top++;
return true;
}
bool Pop(PStack ps, ELEMTYPE* rtval)
{
assert(ps != NULL);
if (IsEmpty(ps))return false;
*rtval = ps->base[ps->top - 1];
ps->top--;
return true;
}
bool Top(PStack ps, ELEMTYPE* rtval)
{
assert(ps != NULL);
if (IsEmpty(ps))return false;
*rtval=ps->base[ps->top - 1];
return true;
}
int Get_length(PStack ps)
{
assert(ps != NULL);
return ps->top;
}
bool IsEmpty(PStack ps)
{
assert(ps != NULL);
return ps->top == 0;
}
bool IsFull(PStack ps)
{
assert(ps != NULL);
return ps->top == ps->stacksize;
}
static void Inc(PStack ps)
{
ps->base = (ELEMTYPE*)realloc(ps->base, 100);
if (ps->base == NULL)
{
assert(0);
return;
}
ps->stacksize *= 2;
}
void Clear(PStack ps)
{
ps->top = 0;
}
void Destory(PStack ps)
{
ps->top = 0;
free(ps->base);
ps->base = NULL;
}
void Show(PStack ps)
{
assert(ps != NULL);
int i = 0;
while (i < ps->top)
{
printf("%d ", ps->base[i]);
i++;
}
printf("\n");
}
int main()
{
Stack pl;
Init_stack(&pl);
for (int i = 0; i < 10; i++)
{
Push(&pl,i+1);
}
Show(&pl);
return 0;
}