栈和队列(出栈、入栈和其他栈的操作)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/csuft20164442/article/details/86546851

定义

栈(Stack)是一个后进先出的线性表,它要求只在表尾进行删除和插入操作。

注:表尾称为栈的栈顶(top),相应的表头称为栈底(bottom)。

栈的插入和删除操作

插入操作(Push):叫做进栈,也称为压栈、入栈。
删除操作(Pop):叫做出栈,也称为弹栈。

栈的存储结构

栈本身是一个线性表,线性表分为顺序存储结构和栈的链式存储结构两种存储形式。
在这里插入图片描述

顺序存储结构

定义:

typedef int ElemType;
typedef struct
{
    ElemType *base; //指向栈底的指针变量
    ElemType *top;  //指向栈顶的指针变量
    int stackSize;  //指示栈的当前可使用的最大容量
}sqStack;

创建一个栈

#define STACK_INIT_SIZE 100  //初始化栈的空间为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; //可用空间为定义空间
}

入栈(插入)操作

  • 入栈操作又叫压栈操作,就是向栈中存放数据。
  • 人员在入栈操作要在栈顶进行,每次向栈中压入一个数据,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);//返回当前栈容量值
}

猜你喜欢

转载自blog.csdn.net/csuft20164442/article/details/86546851
今日推荐