栈的表示和实现(C语言)

简介: 栈的表示和实现(C语言)

💨栈的概念及结构

✔概念

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。

✔结构

进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。

栈中的数据元素遵循后进先出的原则。

压栈:栈的插入操作叫做 进栈/压栈/入栈,入数据在栈顶

出栈:栈的删除操作叫出栈。出数据也在栈顶


👇练习题

图片.png

这道题很简单,栈的数据元素规则就是后进先出,这组元素中,E是最后进来的所以它先出去,其次就是元素D。                所以选B


栈可以想象成一个管道,你从管道口往里放一个东西,之后如果你还想放东西是不是还是需要从管道口往里放?那么你第一次放的东西就越靠近里面了,你没取一次东西肯定是先从靠近管道口的位置取。

便于学习时,也可以看成弹夹。


图片.png

这题答案是C。

A中顺序:1进--1出--234进完--4出--3出--2出

B中顺序:12进--2出--3进--3出--4进--4出--1出

D中顺序:123进--3出--4进--4出--2出--1出


💨栈的实现

推荐使用数组来实现栈

下面我们来看具体需要实现栈的哪些需求。


🎈Stack.h

#pragma once#include<stdio.h>#include<stdbool.h>#include<assert.h>#include<stdlib.h>typedefintSTDataType;
typedefstructStack{
STDataType*a;
inttop;
intcapacity;
}ST;
voidStackInit(ST*ps); //初始化voidStackDestory(ST*ps); //销毁voidStackPush(ST*ps, STDataTypex); //入栈voidStackPop(ST*ps);  //出栈STDataTypeStackTop(ST*ps); //返回栈顶元素intStackSize(ST*ps); //求栈数据个数boolStackEmpty(ST*ps); //判断栈是否为空

一些解释:

🚩#pragma once是预编译

🚩头文件中assert是类型断言的头文件,断言函数assert(),只有当括号内判断为真时才执行程序下面的代码

🚩定义的结构体中,top是栈顶指针,capacity是容量(不够的时候要增容)


🎈Stack.c

#include"Stack.h"voidStackInit(ST*ps) //初始化{
assert(ps); //结构体指针不能为空ps->a=malloc(sizeof(STDataType)*4); //动态内存开辟空间if (ps->a==NULL)
    {
printf("malloc fail\n");
exit(-1);
    }
ps->capacity=4;
ps->top=0 ;  //如果top给0意味着指向的是栈顶元素的下一个 ; -1表示指向栈顶元素}
voidStackDestory(ST*ps) //销毁{
assert(ps);
free(ps->a);
ps->a=NULL;
ps->top=ps->capacity=0;
}
voidStackPush(ST*ps, STDataTypex) //入栈{
assert(ps);
if (ps->top==ps->capacity)
    {
STDataType*tmp=realloc(ps->a, ps->capacity*2*sizeof(STDataType));
if (tmp==NULL)
        {
printf("realloc fail\n");
exit(-1);
        }
else        {
ps->a=tmp;
ps->capacity*=2;
        }
    }
ps->a[ps->top] =x;
ps->top++;
}
voidStackPop(ST*ps)  //出栈{
assert(ps);
//栈空了,调用Pop,直接中止程序报错assert(ps->top>0);
ps->top--;
}
STDataTypeStackTop(ST*ps) //返回栈顶元素{
assert(ps);
assert(ps->top>0);
returnps->a[ps->top-1];
}
intStackSize(ST*ps)
{
assert(ps);
returnps->top;
}
boolStackEmpty(ST*ps) //判断栈是否为空{
assert(ps);
returnps->top==0;
}

🎈main.c测试接口

#include<stdio.h>#include"Stack.h"intmain()
{
STst; //声明一个结构体变量StackInit(&st);//初始化栈StackPush(&st, 1);  //入栈数据1,2,3,4,5StackPush(&st, 2);
StackPush(&st, 3);
StackPush(&st, 4);
StackPush(&st, 5);
while (!StackEmpty(&st)) //如果栈不为空,就可以取数据    {
printf("%d ", StackTop(&st));
StackPop(&st);   //出栈    }
printf("\n");
StackDestory(&st);//销毁栈return0;
}
目录
相关文章
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
196 9
|
7月前
|
C语言
链栈的初始化以及用C语言表示进栈、出栈和判断栈空
链栈的初始化以及用C语言表示进栈、出栈和判断栈空
81 3
|
7月前
|
C语言
C语言栈的行编辑程序讲解
C语言栈的行编辑程序讲解
134 0
|
7月前
|
机器学习/深度学习 存储 算法
C语言栈与递归的实现讲解
C语言栈与递归的实现讲解
123 0
|
7月前
|
C语言
C语言栈的括号匹配的检验讲解及相关代码
C语言栈的括号匹配的检验讲解及相关代码
159 0
|
25天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
48 5
|
2月前
|
C语言
数组栈的实现(C语言描述)
本文介绍了如何在C语言中使用数组来实现栈的数据结构,包括栈的创建、入栈、出栈、获取栈顶元素、检查栈是否为空、获取栈的大小以及销毁栈等操作,并提供了相应的函数实现。
43 1
|
3月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
482 8
|
3月前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
526 3
|
6月前
|
C语言
C语言的栈帧
C语言的栈帧