【5】顺序栈

本文详细介绍顺序栈的数据结构、工作原理,包括创建、入栈、出栈等操作,并给出了C语言的代码实现。通过SeqStack.h和SeqStack.c文件展示了如何使用和维护一个线性堆栈,适合初学者理解栈的FILO特性。

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


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

  1. 栈特点:
    先进后出 FILO first last in out
    后进先出 LIFO

顺序栈 :sequeue 顺序 stack 栈

逻辑结构:线性结构
存储结构:顺序存储(数组)

SeqStack.h

/**
** Created by 24122 on 2022/4/23.
**/

#ifndef DATASTRUCTURE_SEQSTACK_H
#define DATASTRUCTURE_SEQSTACK_H
typedef int datatype;
typedef struct
{
    datatype *data;
    int length;
    int top;
}seqstack_t;

/**
* 1.创建顺序栈
*/
seqstack_t *CreateSeqStack(int length);

/**
*   2.入栈
*/
int PushStact(seqstack_t *p,datatype data);

/**
* 3.判断栈是否满
*/
int SeqStackIsFull(seqstack_t *p);

/**
 * 4.出栈
 */
int PopStack(seqstack_t *p);

/**
*   5.判断栈是否为空
*/
int SeqStackIsEmpty(seqstack_t *p);

/**
*   6.求栈的长度
*/
int SeqStackLength(seqstack_t *p);

/**
* 7.获取栈顶的值
*/
datatype SeqStackTopData(seqstack_t *p);

/**
 * 8.清空栈
*/
void SeqStackClear(seqstack_t *p);


/**
 * 9.销毁栈
 */
void SeqStackDestroy(seqstack_t **sp);


#endif //DATASTRUCTURE_SEQSTACK_H

SeqStack.c

/**
** Created by 24122 on 2022/4/23.
**/

#include <stdio.h>
#include <stdlib.h>
#include "SeqStack.h"

/**
* 1.创建顺序栈
*/
seqstack_t *CreateSeqStack(int length)
{
    //1.创建一个保存栈信息的结构体
    seqstack_t *p = (seqstack_t *) malloc(sizeof (seqstack_t));
    //2.容错判断
    if(p == NULL)
    {
        printf("CreateSeqStack error!\n");
        return NULL;
    }
    //3.初始化
    p->data = (datatype *) malloc(sizeof (datatype) * length);
    //4。容错判断
    if(p->data ==NULL)
    {
        printf("CreateStack error!\n");
        return NULL;
    }
    p->length=length;
    p->top = -1;//空栈
    return p;
}
/**
*   2.入栈
*/
int PushStact(seqstack_t *p,datatype data)
{
    if(SeqStackIsFull(p)){
        printf("PushStact error\n");
        return -1;
    }
    //2.插入数据:1.先让栈针后移,在赋值,
     //         2.先向下一个位置赋值在加一
    p->top++;
    //*((p->data)+p->top) =data;
    p->data[p->top] = data;
    //printf("%4d入栈 ", p->data[p->top]);
    return 0;
}

/**
* 3.判断栈是否满
*/
int SeqStackIsFull(seqstack_t *p)
{
    return p->top +1 ==p->length;// 1:满  0:  不满
}
/**
 * 4.出栈
 */
datatype PopStack(seqstack_t *p)
{
    datatype tmp;
    //1.容错处理
    if(SeqStackIsEmpty(p))
    {
        printf("PopStack error\n");
        return -1;
    }
    //1.数据出栈
   // printf("%4d出栈 ", p->data[p->top]);
   tmp=p->data[p->top];
    p->top--;
    return tmp;
    // return p->data[p->top];
}


/**
*   5.判断栈是否为空
*/
int SeqStackIsEmpty(seqstack_t *p)
{
    return p->top == -1; // 1:空  0:非空
}


/**
*   6.求栈的长度
*/
int SeqStackLength(seqstack_t *p)
{
    if(SeqStackIsEmpty(p))
    {
        printf("SeqStackLength error\n");
        return -1;
    }
    return p->top+1;
}
/**
* 7.获取栈顶的值
*/
datatype SeqStackTopData(seqstack_t *p)
{
    if(SeqStackIsEmpty(p))
    {
        printf("SeqStackTopData error\n");
        return -1;
    }
    return p->data[p->top];
}
/**
*
 * 8.清空栈
*/
void SeqStackClear(seqstack_t *p)
{
    p->top=-1;
}
/**
 * 9.销毁栈
 */
void SeqStackDestroy(seqstack_t **sp)
{
    free((*sp)->data);
    free(*sp);
    *sp=NULL;
}

main.c

/**
** Created by 24122 on 2022/4/23.
**/

#include <stdlib.h>
#include <stdio.h>
#include "SeqStack.h"
#define N 10


int main()
{
    seqstack_t *p = CreateSeqStack(N);

    //入栈
    for (int i = 1; i <= 10; i++) {
        PushStact(p, i);
    }
    //出栈
    while (!SeqStackIsEmpty(p))
    {
        printf("%d ", PopStack(p));
    }
    putchar(10);


    /*//长度
    int i=SeqStackLength(p);
    printf("%d",i);

    //栈顶的值
    int j=SeqStackTopData(p);
    printf("%d",j);

    SeqStackClear(p);
    printf("SeqStackIsEmpty:%d", SeqStackIsEmpty(p));

    SeqStackDestroy(&p);
    printf("p:%p", p);*/


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值