不定长顺序栈
栈:只允许在栈顶进行操作
特点:先进后出
1、头文件(seqstack.h)
#pragma once//防止头文件重复引用
//不定长顺序表实现栈
#define INITSIZE 10
typedef struct Stack
{
int *elem;//数据
int top;//栈顶指针 表示当前可以存放数据的下标
int stacksize;//栈的总格子数(容量)
}Stack,*PStack;
//初始化
void InitStack(PStack ps);
//入栈
bool Push(PStack ps,int val);
//获取栈顶值 但不删除
//rtval:输出参数
bool GetTop(PStack ps,int *rtval);
//获取栈顶值并删除
bool Pop(PStack ps,int *rtval);
//获取有效数据个数
int GetLength(PStack ps);
//判空
bool IsEmpty(PStack ps);
//清空
void Clear(PStack ps);
//摧毁
void Destroy(PStack ps);
//打印
void Show(PStack ps);
2、源文件(seqstack.cpp)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "seqstack.h"
//初始化
void InitStack(PStack ps)
{
assert(ps != NULL);
ps->elem = (int *)malloc(sizeof(int)*INITSIZE);
ps->top = 0;
ps->stacksize = INITSIZE;
}
//判满(内部函数)
static bool IsFull(PStack ps)
{
return ps->top == ps->stacksize;
}
//扩容(内部函数)
static void Inc(PStack ps)
{
ps->elem = (int *)realloc(ps->elem,ps->stacksize*2*sizeof(int));
ps->stacksize *= 2;
}
//入栈
bool Push(PStack ps,int val)
{
assert(ps != NULL);
if(IsFull(ps))
{
Inc(ps);
}
ps->elem[ps->top] = val;//ps->elem[ps->top++] = val;
ps->top++;
return true;
}
//获取栈顶值 但不删除
//rtval:输出参数
bool GetTop(PStack ps,int *rtval)
{
if(IsEmpty(ps))
{
return false;
}
*rtval = ps->elem[ps->top-1];
return true;
}
//出栈 :获取栈顶值并删除
bool Pop(PStack ps,int *rtval)
{
if(IsEmpty(ps))
{
return false;
}
*rtval = ps->elem[ps->top-1];
ps->top--;
return true;
}
//获取有效数据个数
int GetLength(PStack ps)
{
return ps->top;
}
//判空
bool IsEmpty(PStack ps)
{
return ps->top == 0;
}
//清空
void Clear(PStack ps)
{
ps->top = 0;
}
//摧毁
void Destroy(PStack ps)
{
free(ps->elem);
ps->elem = NULL;
}
//打印
void Show(PStack ps)
{
for(int i = 0; i < ps->top;i++)
{
printf("%d ",ps->elem[i]);
}
printf("\n");
}
3、测试源文件(test.cpp)
#include <stdio.h>
#include <vld.h>//测试内存泄漏的头文件
#include "seqstack.h"
int main()
{
Stack s;
InitStack(&s);//测试初始化
for(int i=0;i<20;i++)
{
Push(&s,i);//测试入栈
}
Show(&s);//测试打印
printf("%d\n",GetLength(&s));//测试获取有效数据的个数
int tmp;
GetTop(&s,&tmp);//测试获取栈顶值 但不删除
printf("%d\n",tmp);
int tmp1;
while(!IsEmpty(&s))
{
Pop(&s,&tmp1);//测试出栈
printf("%d\n",tmp1);
}
Destroy(&s);//测试摧毁
Destroy(&s);
return 0;
}