C语言丨栈(一):顺序栈

本文详细介绍了栈的数据结构概念,特别是顺序栈的定义、用数组表示的方式,包括栈顶指针的操作。涵盖了初始化、进栈、出栈、读取栈顶元素和栈的遍历,以及相关实例代码。适合理解基本的FILO/LIFO原则和技术实现。
摘要由CSDN通过智能技术生成

是限定仅在表尾进行插入或删除操作的线性表,表尾称为栈顶(top),表头称为栈底(bottom)。栈的最主要特点就是“先进后出”(FILO),或“后进先出”(LIFO)。本文在介绍栈的基本概念的基础上,重点介绍栈的顺序表示及相应的算法


定义

用顺序存储方式实现的栈称为顺序栈,顺序栈对应于顺序表。

设栈中的数据元素的类型是整型,用一个足够长的一维数组s来存放元素,数组的最大容量为STACK_INTSIZE。同时假设栈顶指针top。(在以下的程序中,top不是指向当前的栈顶元素,而是指向下一次将要进栈的元素的存储位置)

顺序栈可以描述如下:

#define STACK_INTSIZE 50 /*分配栈的最大存储空间*/
#define DataType int /*定义栈中数据元素的类型*/
DataType s[STACK_INTSIZE];/*用来存放栈中数据元素的内存空间*/
int top;/*定义栈顶指针*/

可以用结构体数组来实现顺序栈:

#define STACK_INTSIZE 50
#define DataType int
typedef struct
{
    DataType s[STACK_INTSIZE];
    int top;
} Stack;
Stack *st;/*指针st用来引用一个顺序栈*/

栈顶指针动态地反映了栈中元素的变化情况,top=0时,表示空栈top=1时,表示已经有一个元素进栈进栈时,栈顶指针top上移,top加1top=STACK_INTSIZE,表示栈满出栈时,栈顶指针top下移,top减1

1.建立空栈

Stack *InitStack()
{
    Stack *s;
    s = (Stack *)malloc(sizeof(Stack));
    s->top = 0;
    return s;
}

2.进栈

void Push(Stack *st, DataType x)
{
    if (st->top >= STACK_INTSIZE)
        printf("栈已满,不能入栈!\n");/*若栈满则不能进栈,输出出错信息*/
    else
    {
        st->s[st->top] = x;/*元素x进栈*/
        st->top++;/*栈顶指针top加1*/
    }
}

3.出栈

void Pop(Stack *st)
{
    if (st->top == 0)
        printf("栈空,不能出栈!\n");/*若栈空则不能出栈,且输出栈空的信息*/
    else/*栈非空*/
    {
        st->top--;/*top减1,元素出栈*/
    }
}

4.读栈顶元素

DataType ReadTop(Stack *st)
{
    DataType x;
    if (st->top == 0)
    {
        printf("栈中无元素");
        return (0);
    }
    /*若栈空则返回0*/
    else
    {
        x = st->s[st->top-1];/*取栈顶元素*/
        return (x);/*返回x即栈顶元素的值*/
    }
}

5.遍历栈

结合元素出栈算法和读取栈顶元素算法,使用循环,当st->top=0时结束循环,即可遍历栈

void ShowStack(Stack *st)
{
    while (st->top > 0)
    {
        st->top--;
        printf("%d", st->s[st->top]);
    }
}

参考文献:

文益民 张瑞霞 李健 编著,数据结构与算法(第2版),清华大学出版社,P40,P42-45.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值