#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
# include <string.h>
#include "stack.h"//自己写的头文件
#define INITSIZE 10typedef char ElemType;
typedef struct Stack
{
ElemType* base;
ElemType* top;//栈顶指针,指向当前可以存放数据的位置
int stacksize;//总大小
}Stack, * PStack;//PStack==Stack*//初始化
void InitStack(PStack ps)
{
assert(ps != NULL);
ps->base = (ElemType*)malloc(INITSIZE * sizeof(ElemType));
assert(ps->base != NULL);
if (ps == NULL)
return;
ps->top = ps->base;
ps->stacksize = INITSIZE;
}//判满,内部函数
static bool IsFull(PStack ps)
{
return ps->base + ps->stacksize == ps->top;
}//扩容函数(扩大到原来容量的2倍),内部函数
static void Inc(PStack ps)
{
ps->base = (ElemType*)realloc(ps->base, 2 * ps->stacksize * sizeof(ElemType));
assert(ps->base != NULL);
if (ps->base == NULL)
{
perror("扩容失败");//输出错误信息
return;
}
ps->top = ps->base + ps->stacksize;//必须重新赋值
ps->stacksize *= 2;
}//入栈
bool Push(PStack ps, ElemType val)
{
if (IsFull(ps))
{
Inc(ps);
}
*ps->top++ = val;//*ps->top = val; ++ps->top;return true;
}//获取栈顶元素,且删除栈顶元素
bool Pop(PStack ps, ElemType* rtval)
{
if (IsEmpty(ps))
return false;
*rtval = *(--ps->top);return true;
}//获取栈顶元素,但不删除
bool GetTop(PStack ps, ElemType* rtval)
{
if (IsEmpty(ps))
return false;
*rtval = *(ps->top - 1);
return true;
}//判空
bool IsEmpty(PStack ps)
{
return ps->top == ps->base;
}//获取长度
int GetLength(PStack ps)
{
return ps->top - ps->base;
}//销毁栈
void Destroy(PStack ps)
{
free(ps->base);
ps->base = NULL;
ps->top = NULL;//(*ps).top = NULL;
ps->stacksize = 0;
//ps = NULL;//没有意义
}//清空栈
void ClearStack(PStack ps)
{
ps->top = ps->base;
}
栈(扩容)的初始化、判满、扩容、入栈、获取栈顶元素且删除、获取栈顶元素不删除等等
最新推荐文章于 2024-01-09 22:52:58 发布