欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

栈的入栈,出栈,扩容,获取长度等操作

程序员文章站 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;//没有用,没有解引用,只是修改了形参的值,第二句指向符自带解引用
}
相关标签: 基于c的数据结构