数据结构与算法笔记 lesson 9 栈

栈是一种重要的线性结构,是线性表的一种具体形式。

后进先出的(LIFO)的线性表,要求只在末尾进行删除和插入操作

栈的存储结构

最开始栈中不含有任何数据,叫空栈,此时栈顶就是栈底。然后数据从栈顶进入,栈顶栈底分离,整个栈的当前容量变大。数据出栈时从栈顶弹出,栈顶下移,整个栈的当前容量变小。

 typedef struct
 {
    ElemType *base;
    ElemType *top;
    int stackSize;
 }sqStack;

创建栈

 #define STACK_INIT_SIZE 100
 initStack(sqStack *s)
 {
    s->base = (ElemType *)malloc(STACK_INIT_SIZE *sizeof(ElemType) );
    if(!s->base) 
      exit(0);
    s->top=s->base;
    s->stackSize = STACK_INTI_SIZE
 }

入栈

入栈操作又叫压栈操作,就是向栈中存放数据。

入栈操作要在栈顶进行,每次向栈中压入一个数据,top指针就要+1,直到栈满

 #define STACKINCREMENT 10
 Push(sqStack *s ,ElemType e)
 {
    // 如果栈满, 追加空间
    if(s->top - s->base >=s->stackSize)
    {
       s->base = (ElemType *)realloc(s->base , (s->stackSize + STACKINCREMENT )*sizeof(ElemType));
	 if(!s->base)
           exit(0);
        s->top = s->base +s->stackSize;                //设置栈顶
        s->stackSize = s->stackSize+STACKINCREMENT;   //设置栈的最大容量
    }
   *(s->top)=e;
   s->top++;
 }

出栈

出栈操作就是在栈顶取出数据,栈顶指针随之下移的操作

每当从栈内弹出一个数据,栈的当前容量就-1;

 Pop(sqStack *s , ElemType e)
 {
   if(s->top == s->base)
     return ; 
    *e =* - - (s->top); 
 }

清空

将栈中的元素全部作废,但栈本身物理空间并不发生改变(并不是销毁)

 ClearStack(sqStack *s){
   s->top = s-> base;
 }

销毁

释放掉该栈所占据的物理内存空间

 DestroyStack(sqStack *s)
 {
   int i , len ; 
   len = s -> stackSize;
   for(i = 0; i<len ; i++){
    free(s->base);
    s->base++;  
   }
   s->base = s->top = NULL;
   s->stackSize= 0;
 }

栈的容量

当前容量是计算栈中元素的个数 s.top - s.base

最大容量是该栈占据内存空间的大小 其值是s.stackSize

 int StackLen(sqStack s)
 {
   return (s.top - s.base); //当前容量
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值