数据结构-顺序栈

1.概念

栈是只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底。

特点:栈是先进后出FILO(First In Last Out)或( LIFO(Last In First Out))

逻辑结构:线性结构

存储结构:顺序存储

特点:内存连续,大小固定。

操作创建入栈出栈判空判满

2.结构体

顺序栈的结构体

// 顺序栈
typedef struct seqstack
{
    datatype *data; // 指向栈的存储位置
    int maxlen;     // 保存栈的最大长度
    int top;        // 称为栈针,用的时候,心里面可以将按照顺序表里的last来使用
                    // top 始终代表当前栈内最后一个有效元素的下标
} seqstack_t, *seqstack_p;
// 创建结构体

3.创建空栈

步骤:

(1)malloc一块结构体大小的空间用来保存结构体

(2)开辟一块存放数据的空间

// 1.创建一个空的栈
seqstack_t *CreateEpSeqStack(int len) // len代表的是创建栈的时候的最大长度
{
    // 开辟空间,保存结构体
    seqstack_t *p = (seqstack_t *)malloc(sizeof(seqstack_t));
    if (NULL == p)
    {
        printf("CreateEpSeqStack error.\n");
        return NULL;
    }

    // 初始化
    p->maxlen = len;                                      // 最大长度为传入得参数len
    p->top = -1;                                          // 有效元素最大下标,刚开始没有元素,初始化为-1
    p->data = (datatype *)malloc(sizeof(datatype) * len); // 开辟空间存放数据,强制转换为数据的数据类型(int)
    if (p->data == NULL)
    {
        perror("error \n");
        return NULL;
    }

    return p;
}

 4.入栈

(1)判断栈是否满

(2)移动栈针

(3)插入数据

// 3.入栈
// data代表入栈的数据
int PushStack(seqstack_t *p, datatype data)
{
    if (IsFullSeqStack(p))
    {
        perror("push error 无法入栈");
        return -1;
    }
    // 栈针上移,然后赋值
    p->top++;
    p->data[p->top] = data;

    return 0;
}

5.出栈

步骤:

(1)判空

(2)返回数据,输出数据

(3)移动栈针

// 5.出栈,一次出栈一个元素
int PopSeqStack(seqstack_t *p)
{
    if (IsEpSeqStack(p))
    {
        perror("栈为空,无法出栈");
        return -1;
    }

    int res = p->data[p->top];
    p->top--;
    return res;
}
// 5.出栈,一次性全部出栈
int PopSeqStack(seqstack_t *p)
{
    if (IsEpSeqStack(p))
    {
        perror("栈为空,无法出栈");
        return -1;
    }

    循环出栈
    while (p->top != -1)
    {
        printf("%d ", p->data[p->top]);
        p->top--;
    }
    printf("\n");
    return 0;
}

6.其他操作

判满:当栈针(等同于下标)等于最大长度减一时,栈满

判空:当栈针为-1时,表示栈中没有元素,为空。

// 2.判断是否为满,满返回1 未满返回0
int IsFullSeqStack(seqstack_t *p)
{
    return p->top == p->maxlen - 1;
}

// 4.判断栈是否为空
int IsEpSeqStack(seqstack_t *p)
{
    return p->top == -1;
}

清空栈:只需要让栈针等于-1即可,虽然元素还在,但是在电脑眼中,栈已经为空

// 6. 清空栈
void ClearSeqStack(seqstack_t *p)
{
    p->top == -1;
}

获取栈顶元素:注意不是出栈操作,如果出栈,相当于删除了栈顶数据,只是将栈顶的数据获取到,不需要移动栈针

// 7. 获取栈顶数据(注意不是出栈操作,如果出栈,相当于删除了栈顶数据,只是将栈顶的数据获取到,不需要移动栈针)
int GetTopSeqStack(seqstack_t *p)
{
    int res;
    res = p->data[p->top];
    return res;
}

 求栈的长度:只需要用栈针数值加一即可

// 8. 求栈的长度
int LengthSeqStack(seqstack_t *p)
{
    int length = 0;
    length = p->top + 1;
    return length;
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值