(五) 栈

栈的元素必须“后进先出”;栈的操作只能在这个线性表的表尾进行;对于栈来说,这个表尾称为栈的栈顶,相应的表头称为栈底。

1、栈的顺序存储结构:

typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;     //栈的最大容量
}sqStack;

base是指向栈底的指针变量,top是指向栈顶的指针变量,stackSize指示栈的当前可使用的最大容量

2、创建一个栈

#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_INIT_SIZE;
}

3、入栈操作

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

入栈操作要在栈顶进行,每次向栈中压入一个数 据,top指针就要+1,知道栈满为止。

#define SATCKINCREMENT 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++;
}

4、出栈操作

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

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

Pop(sqStack *s, ElemType *e)
{
     if( s->top == s->base )  // 栈已空空是也
                return;
      *e = *--(s->top);
}

5、清空一个栈

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

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

6、销毁一个栈是要释放该栈所占据的物理内存空间

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;
}

7、计算栈的当前容量

计算栈中元素的个数,只要返回s.top-s.base

栈的最大容量是指该栈占据内存空间的大小,其值是s.stackSize,与栈的当前容量不是一个概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值