数据结构-基于顺序表实现栈

本文详细介绍了栈这种线性结构的原理与应用,包括栈的基本概念、基于动态顺序表实现的栈的初始化、扩容、入栈、出栈及取栈顶元素等核心操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先:要了解栈这样一种结构。

栈:一种特殊的线性结构,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。不含任何元素地栈称为空栈,栈又称为后进先出的线性表。
这里写图片描述
基于动态顺序表实现的栈,实现以下操作:

  • 入栈操作
  • 出栈操作
  • 取栈顶元素

为了更好地实现以上操作,需要对栈进行初始化与销毁,容量不够时自动扩容的操作。

顺序栈声明如下:

#pragma once
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
typedef char StackType; 
typedef struct SeqStack
{
    StackType* data;
    size_t size;
    size_t capacity;
}SeqStack;

void SeqStackInit(SeqStack* seqstack);

void SeqStackDestroy(SeqStack* seqstack);

void SeqStackPush(SeqStack* seqstack,StackType value);

void SeqStackPop(SeqStack* seqstack);

int SeqStackTop(SeqStack* seqstack,StackType* value);

初始化

void SeqStackInit(SeqStack* seqstack)
{
    if(seqstack==NULL)
    {
        return;//非法输入
    }
   seqstack->size=0;
   seqstack->capacity=1024;
   seqstack->data=(StackType*)malloc(seqstack->capacity*sizeof(StackType));
}

这里写图片描述

入栈

void SeqStackPush(SeqStack* seqstack,StackType value)
{
    if(seqstack==NULL)
    {
        return;//非法输入
    }
    if(seqstack->size>=seqstack->capacity)
    {
        SeqStackReSize(seqstack);
    }
    seqstack->data[seqstack->size++]=value;
}

这里写图片描述

扩容

扩容时,扩容策略由自己设置,在这里用原大小*2+1,原因是STL的扩容原则就是*2,+1是排除了原大小可能是0的可能性。

扩容完毕,要将原来的数据搬运过来,并且释放掉原来那些不用的内存,以防内存泄漏。

void SeqStackReSize(SeqStack* seqstack)
{
    if(seqstack==NULL)
    {
        return;
    }
    StackType* new_ptr=NULL;
    if(seqstack->size>=seqstack->capacity)
    {
        new_ptr=(StackType*)malloc(seqstack->capacity*sizeof(StackType)*2+1);
    }
    size_t i=0;
    for(i=0;i<seqstack->size;i++)
    {
        new_ptr[i]=seqstack->data[i];
    }
    free(seqstack->data);
    seqstack->data = new_ptr;
}

出栈

void SeqStackPop(SeqStack* seqstack)
{
    if(seqstack==NULL)
    {
        return;
    }
    if(seqstack->size==0)
    {
        return;
    }
    --seqstack->size;
}

这里写图片描述

取栈顶元素

int SeqStackTop(SeqStack* seqstack,StackType* value)
{
    if(seqstack==NULL)
    {
        return 0;
    }
    if(seqstack->size==0)
    {
        return 0;
    }
    *value=seqstack->data[seqstack->size-1];//注意:这里是减一,不能减减
    return 1;
}

这里写图片描述

销毁

void SeqStackDestroy(SeqStack* seqstack)
{   
    if(seqstack==NULL)
    {
        return;//非法输入
    }
   seqstack->size=0;
    free(seqstack->data);
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值