栈的入栈,出栈,扩容,获取长度等操作
程序员文章站
2024-03-21 13:15:04
...
创建stack.h
#pragma once
//栈:一种访问受限的线性表,只能在一端进行数据操作,能操作
//顺序栈,栈顶设计在顺序表的表尾处,因为顺序表尾插和尾删都是O(1)
#define INIT_SIZE 10
typedef struct SeqStack
{
int *elem;//保存动态内存的地址,用于存放栈数据
int top;//栈顶指针,当前可以存放数据的下标,类似顺序表的有效数据个数
int stacksize;//栈容量
}SeqStack,*PSeqStack;
//初始化
void InitStack(PSeqStack ps);
//入栈
bool Push(PSeqStack ps,int val);
//出栈,获取栈顶值,并删除栈顶元素
bool Pop(PSeqStack ps,int *rtval);
//获取栈顶值,但不删除
bool GetTop(PSeqStack ps,int *rtval);
//判空
bool IsEmpty(PSeqStack ps);
//获取长度
int GetLength(PSeqStack ps);
//清除数据
void Clear(PSeqStack ps);
//销毁栈
void Destory(PSeqStack ps);
创建stack.cpp
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
#include"stack.h"
//判空
static void DeterPointNull(PSeqStack ps)
{
assert(ps!=NULL);
if(ps==NULL)
{
exit(0);
}
}
//初始化
void InitStack(PSeqStack ps)
{
DeterPointNull(ps);
ps->elem=(int *)malloc(INIT_SIZE*sizeof(int));
ps->top=0;
ps->stacksize=INIT_SIZE;
}
//判满
static bool IsFull(PSeqStack ps)
{
return ps->top==ps->stacksize;
}
//扩容
static void Inc(PSeqStack ps)
{
ps->elem=(int *)realloc(ps->elem,ps->stacksize*2*sizeof(int));
}
//入栈
bool Push(PSeqStack ps,int val)
{
DeterPointNull(ps);
if(IsFull(ps))
{
Inc(ps);
}
ps->elem[ps->top++]=val;
//ps->top++;
return true;
}
//出栈,获取栈顶值,并删除栈顶元素
bool Pop(PSeqStack ps,int *rtval)//rtval:输出参数:通过输出参数可以将多个值返回
{
DeterPointNull(ps);
if(IsEmpty(ps))
{
return false;
}
*rtval=ps->elem[ps->top-1];
ps->top--;
return true;
}
//获取栈顶值,但不删除
bool GetTop(PSeqStack ps,int *rtval)
{
DeterPointNull(ps);
if(IsEmpty(ps))
{
return false;
}
*rtval=ps->elem[ps->top-1];
return true;
}
//判空
bool IsEmpty(PSeqStack ps)
{
return ps->top==0;
}
//获取长度
int GetLength(PSeqStack ps)
{
DeterPointNull(ps);
return ps->top;
}
//清除数据
void Clear(PSeqStack ps)
{
DeterPointNull(ps);
ps->top=0;
}
//销毁栈
void Destory(PSeqStack ps)
{
DeterPointNull(ps);
free(ps->elem);//释放动态内存
ps->elem=NULL;//防止成为野指针
ps->top=0;
ps->stacksize=0;
//ps=NULL;//没有用,没有解引用,只是修改了形参的值,第二句指向符自带解引用
}