本文件为不定长顺序栈,能自动扩容
栈:后进先出,后来的反而需要先服务(访问受限的线性表)
栈分为顺序栈和链式栈
栈只能在一端进行插入和删除,插入删除的这一端称为栈顶(表尾),另一端称为栈底(表头)
顺序栈的栈顶在尾部,因为顺序表在尾部操作的时间复杂度为O(1)
本文件由三个文件构成: stack.h 、 stack.cpp 、 main.cpp
顺序栈和顺序表十分相似,是访问受限的顺序表
stack.h 头文件
//顺序栈
#pragma once
#include<malloc.h>
#include<assert.h>
#define INIT_SIZE 10
typedef struct Stack
{
int* base;//指向动态内存
int top;//栈顶指针,实际为下标(注意:书上为指针,顺序表用下标更好一些)
//top是当前可以存放数据的下标
int stacksize;//栈的总大小
}Stack,*PStack;
//初始化
void InitStack(PStack ps);
//往栈中入数据(入栈操作)
bool Push(PStack ps, int val);
//获取栈顶元素的值,但不删除
bool GetTop(PStack ps, int* rtval);
//获取栈顶元素的值,并且删除
bool Pop(PStack ps,int* rtval);
//判空
bool IsEmpty(PStack ps);
//判满
static bool IsFull(PStack ps);
//扩容
static void Inc(PStack ps);
//获取栈中有效数据的个数
int GetLength(PStack ps);
//清空所有的数据
void Clear(PStack ps);
//销毁
void Destroy(PStack ps);
stack.cpp 文件
#include"stack.h"//顺序栈
//初始化
void InitStack(PStack ps)
{
assert(ps != NULL);
if (ps == NULL)
return;
ps->base = (int*)malloc(INIT_SIZE* sizeof(int));
assert(ps->base != NULL);
ps->top = 0;
ps->stacksize = INIT_SIZE;
}
//往栈中入数据(入栈操作)
bool Push(PStack ps, int val)
{
assert(ps != NULL);
if (ps == NULL)
return false;
if (IsFull(ps))
{
Inc(ps);
}
ps->base[ps->top++] = val;
return true;
}
//获取栈顶元素的值,但不删除
//输出参数
bool GetTop(PStack ps,int *rtval)
{
assert(ps != NULL);
if (ps == NULL)
return false;
if (IsEmpty(ps))//判空!
return false;
*rtval=ps->base[ps->top-1];//要-1
return true;
}
//获取栈顶元素的值,并且删除
bool Pop(PStack ps,int *rtval)
{
assert(ps != NULL);
if (ps == NULL)
return false;
if (IsEmpty(ps))//判空!
{
return false;
}
//*rtval = ps->base[ps->top - 1];
//ps->top--;
*rtval = ps->base[--ps->top];
return true;
}
//判空
bool IsEmpty(PStack ps)
{
assert(ps != NULL);
if (ps == NULL)
return false;
return ps->top == 0;
}
//判满
static bool IsFull(PStack ps)
{
return ps->top == ps->stacksize;
}
//扩容
static void Inc(PStack ps)
{
ps->stacksize *= 2;//扩容2倍
ps->base = (int*)realloc(ps->base,ps->stacksize * sizeof(int));
assert(ps->base != NULL);
}
//获取栈中有效数据的个数
int GetLength(PStack ps)
{
assert(ps != NULL);
if (ps == NULL)
return -1;
return ps->top;
}
//清空所有的数据
void Clear(PStack ps)//只清空数据
{
assert(ps != NULL);
if (ps == NULL)
return;
ps->top;
}
//销毁
void Destroy(PStack ps)//销毁动态内存
{
assert(ps != NULL);
if (ps == NULL)
return;
free(ps->base);
ps->base = NULL;
ps->top = 0;
ps->stacksize = 0;
}
main.cpp 文件,用于测试
#include"stack.h"
#include<stdio.h>
//#include<vld.h>
int main()
{
Stack s;
InitStack(&s);
for (int i = 0; i < 13; i++)
{
Push(&s, i);
}
int val;
GetTop(&s,&val);//获取栈顶
printf("%d\n", val);
Pop(&s,&val);
GetTop(&s, &val);//删除栈顶
printf("%d\n", val);
Destroy(&s);//不销毁,会泄露动态内存
return 0;
}