顺序栈常用操作(不定长)

本文介绍了栈这种数据结构的基本概念,包括栈的后进先出特性以及顺序栈和链式栈的区别。详细阐述了使用C语言实现的不定长顺序栈,包括初始化、入栈、获取栈顶元素、出栈、获取栈长度、清空和销毁栈等基本操作。同时,代码中包含了动态扩容的机制,确保栈在满时能够自动扩展。
摘要由CSDN通过智能技术生成

1、栈的相关概念

栈:限定仅在表尾进行插入或删除操作的线性表

栈是后进先出:后来的反而需要先服务

栈分为顺序栈和链式栈(本节为不定长的顺序表,能自动扩容)

栈只能在一端进行插入和删除,插入和删除的这一端称为栈顶,另一端称为栈底

2、基本操作

首先进行定义结构体

typedef struct Stack{
    int* base;//指向动态内存
    int top;//栈顶指针,也是下标(存放数据的下标)
    int stacksize;//栈的总大小
}Stack,*PStack;

//初始化

#define INIT_SIZE 20

void InitStack(PStack ps){
    assert(ps!=NULL);
    if(ps==NULL){
        return;
    }
//开辟内存
    ps->base=(int*)malloc(INIT_SIZE*sizeof(int));
    assert(ps->base!=NULL);
//初始化就要让结构体内所有元素进行初始化
    ps->top=0;
    ps->stacksize=INIT_SIZE;
}

//往栈中入数据(入栈)

static void Inc(PStack ps){
//进行扩容
    ps->stacksize*=2;
//将扩容后的开辟新的动态内存
//不能写做ps->base=...realloc...编译器不通过
    int *p=(int*)realloc(ps->base,ps->stacksize*sizeof(int));
    if(p==NULL){
        IsFull(ps);
    }
    else{
        ps->base=p;
    }
    assert(ps->base!=NULL);
}
static bool IsFull(PStack ps){
    return ps->top==ps->stacksize;//判满条件
}
bool Push(PStack ps,int val){
    assert(ps!=NULL);
    if(ps==NULL){
        return false;
    }
    if(IsFull(ps)){
        Inc(ps);
    }
//表尾(栈顶)处插入,即入栈
    ps->base[ps->top]=val;
    return true;
}

//获取栈顶元素的值,但是不删除

bool GetTop(PStack ps,int *rtval){//*rtval为输出参数
    assert(ps!=NULL);
    if(ps==NULL){
        return false;
    }
    if(IsEmpty(ps)){
        return false;
    }
    *rtval=ps->base[ps->top-1];
    return true;
}

//获取栈顶元素的值,并且删除

bool Pop(PStack ps,int *rtval){
    assert(ps != NULL);
	if (ps == NULL) {
		return false;
	}
	if (IsEmpty(ps)) {
		return false;
	}
    *rtval=ps->base[--ps->top];
    return true;
}

//获取栈中有效元素个数

int GetLength(PStack ps){
    assert(ps!=NULL);
    if(ps==NULL){
        return 0;
    }
    return ps->top;//有效数据的个数
}

//清空所有数据

void Clear(PStack ps){
    assert(ps!=NULL);
    if(ps==NULL){
        return;
    }
    ps->top=0;
}

//销毁

void Destroy(PStack ps){
    assert(ps!=NULL);
    if(ps==NULL){
        return;
    }
    free(ps->base);
    ps->base=NULL;
    ps->top=0;
    ps->stacksize=0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值