C数据结构栈

本章介绍的主要内容是数据结构中栈的概念和栈的基本操作,包括:栈结构的定义、初始化、容量检查、判空、入栈、出栈、读取栈顶元素、读取栈内元素个数、栈的销毁等操作的具体实现。

栈的概念:

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈,出数据也在栈顶。

 创建三个文件,手动实现一个栈:

 

 栈的基本操作主要有:栈的初始化、判空、判满、取栈顶元素、在栈顶进行插入和删除,后下文将逐一实现。在栈顶插入元素称为入栈,在栈顶删除元素称为出栈。

栈的定义:

typedef int STDataType;  

typedef struct Stack
{
    STDataType* data; //动态开辟数组
    int top;      //栈顶
    int capacity; //容量
}ST; 

栈的初始化:

 从图上可以看出,空栈的栈顶指针的指向和栈底指针的指向一致,非空栈时栈中的栈顶指针始终在栈顶元素的下一个位置;

就是初始化成空栈,把 data指针置为NULLtopcapacity初始化为0

void StackInit(ST* ps)   
{
    assert(ps); //传进来的地址一定不能为空
    
    ps->data = NULL;
    ps->top = ps->capacity = 0;
}

栈的容量检查:

当我们使一个元素入栈的之前,我们往往需要判断一下栈是否为满栈,防止发生上溢的情况。

怎么判断容量满了呢? 答案:ps->top == ps->capacity.

void StackCheckCapacity(ST* ps)
{
    assert(ps);  //ps不可为空
    
    if(ps->top == ps->capacity)
    {
        //注意细节,如果此时容量为0,就给4个,否则就翻倍
        int newcapacity = (ps->capacity == 0 ? 4 : 2 * ps->capacity ); 
        
        STDataType* newnode = (STDataType*)realloc(ps->data,newcapacity*sizeof(STDataType));
        
        if(newnode == NULL)
        {
            perror("fail");
            exit(-1);
        }
        ps->data = newnode; //重新交接给ps->data
        
        ps->capacity = newcapacity;//更新容量
    }
}

栈的判空:

当我们弹出栈顶元素时,往往需要判断一下栈是否为空来防止发生下溢。

bool StackPush(ST* ps)
{
    assert(ps); //ps不能为空
    
    return ps->top == 0; //等于0就返回1,
}

入栈:

入栈时我们首先要判断栈是否为满栈,如果为满栈我们要首先追加存储空间,然后才能将元素入栈。

 

void StackPush(ST* ps,STDataType val)
{
    assert(ps); 
    
    StackCheckCapacity(ps); //检查容量是否满了
    
    ps->data[ps->top++] = val;
}

出栈:

出栈时我们首先要判断栈是否为空栈,然后只需要ps->top减去1就行。

void StackPop(ST* ps)
{
    assert(ps);
    
    assert(!StackEmpty(ps));
    
    ps->top--;
}

读取栈顶元素:

直接把ps->top-1的值返回

STDataType StackTop(ST* ps)
{    
	assert(ps);        
	assert(!StackEmpty(ps));        
	return ps->data[ps->top - 1];
}


栈的元素个数:

直接把ps->top的值返回

size_t StackSize(ST* ps)
{
    assert(ps);
    
    return ps->top;
}

栈的销毁:

void StackDestroy(ST* ps)
{    
	assert(ps);    
	free(ps->data);
	//当ps->data是NULL时候,free什么都不会做    
	ps->data = NULL;    
	ps->top = ps->capacity = 0;
}

栈的打印:配合入栈和出栈、栈顶、栈的判空四个函数

int main()
{
	ST p;
	StackInit(&p);
	while (!StackEmpty(&p))
	{
		printf("%d ", StackTop(&p));
		StackPop(&p);
	}
	return 0;
}

数据结构的栈内容到此介绍结束了,感谢您的阅读!!!

如果内容对你有帮助的话,记得给我三连(点赞、收藏、关注)——做个手有余香的人。感谢大家的支持!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值