栈——顺序栈

栈:

限定在表尾进行插入和删除的线性表(受到限制的线性表),是一种先进后出,后进先出的数据结构

1 顺序栈:

和链表中的顺序表类似,不过栈是在尾部进行操作,少了头部和中间的几个函数,这里我直接实现一下代码。

stack.h

typedef int ELEM_TYPE
#define INIT_SIZE 10
sturct Stack
{
  ELEM_TYPE *base; //接受malloc从堆内存申请的连续存储单元  
  int top;         //保存有效数据长度
  int stacksize;
}Stack,*PStack 

初始化
void Init_Stack(PStack ps);

入栈
bool Push(PStack ps,ELEM_TYPE val);

出栈
bool Pop(PStack ps,ELEM_TYPE *rtval); //rtval是输出参数,返回出栈的值。

获取栈顶元素
bool Top(PStack ps,ELEM_TYPE *rtval);

获取有效数据个数
int Get_length(PStack ps);

判空
bool IsEmpty(PStack ps);

判满
bool IsFull(PStack ps);

扩容函数  //两倍扩容
void Inc(PStack ps);

清空
void Clear(PStack ps);

销毁
void Destroy(PStack ps);

stack .cpp

#include "stack.h"
#inclide <stdio.h>
#include <malloc.h>
#include <assert.h>

void Init_Stack(PStack ps)   初始化
{
  ps->base=(ELEM_TYPE*)malloc(INIT_SIZE * sizeof(ELEM_TYPE));
  assert(ps->base!=NULL);
  ps->top=0;
  ps->stacksize=>INIT_SIZE;
}

bool Push(PStack ps,ELEM_TYPE val)   入栈
{
   assert(ps!=NULL); 
   if(IsFull(ps))    //判满,如果满了需扩容。
   {
    Inc(ps);
   }
   ps->base[ps->top] = val;
   ps->top++;
   return ture;
}

bool IsFull(PStack ps)  判满
{
  return ps->top==ps->stacksize;
}

void Inc(PStack ps)   扩容
{
    ps->base= (ELEM_TYPE*)realloc(ps->base,iszeof(ELEM_TYPE)*ps->stacksize*2);
    assery(ps->base!=NULL);
    ps->stacksize*=2;
}

bool Pop(PStack ps,ELEM_TYPE *rtval)    出栈
{
   if(IsEmpty(ps))
   return false;
   *rtval=ps->pase[--ps->top];    //把出栈的值给rtval,再让有效个数减一
   return ture;
}

bool Top(PStack ps,ELEM_TYPE *rtval)    获取栈顶元素
{
   if(IsEmpty(ps))
   return false;
   *rtval =ps->base[ps->top-1];
   return true;
}

bool IsEmpty(PStack os)   判空
{
  return PStack->ps==0;
}

void Clear(PStack ps)     清空
{
  ps->top=0;      //只要认为里面空间的元素值都是无效值就可以
}

void Destroy(PStack ps)    销毁
{
  free(ps->base);
  ps->base=NULL;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值