数据结构之线性表(4)

server/2024/9/24 5:29:19/

前面我们了解到线性表中的顺序表、链表等结构,今天我们探讨新的一种线性表——
那么我们开始栈的探讨之旅吧。

1.栈的基本概念

1.1栈(Stack):

是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。
栈顶(Top):线性表允许进行插入删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素的空表。
在这里插入图片描述

1.2栈的特点:

因为栈只能在栈顶进行操作,所以栈的特点是先进后出(FILO)

2.栈的实现

对栈的实现,有多种实现的方法
1.顺序栈

  • 静态顺序栈
#define MAX_SIZE 100
typedef struct StackNods
{datatype data[MAX_SIZE];size_t top;size_t capacity;
}ST;

缺点:存储空间有限,多了浪费空间,少了不够用

  • 动态顺序栈
typedef struct StackNods
{datatype *array;size_t top;size_t capacity;
}ST;

2.链栈

typedef struct StackNods
{datatype data;struct StackNods* next;
}ST;

缺点:需要浪费空间存储下一个结点的指针(地址)

综合三种结构,我们采用顺序中的动态栈来完成栈的相关操作:

2.1 栈的初始化

在对栈的初始化之前,有两种情况
top初始化为0的情况
在这里插入图片描述

top初始化为-1的情况
在这里插入图片描述
我们从top初始化为0探讨栈的相关操作

//栈的初始化
void Stackinit(ST *pt)
{assert(pt);pt->array = (datatype*)malloc(sizeof(datatype) * 4);if (pt->array == NULL){printf("malloc fail\n");exit(-1);}pt->capacity = 4;pt->top = 0;
}

2.2压栈

//压栈
void StackPush(ST* pt,datatype x)
{assert(pt);ST* tmp=NULL;if (pt->top == pt->capacity)//表示栈满了 -》扩容{tmp = (datatype*)realloc(pt->array, pt->capacity * sizeof(datatype) * 2);if (tmp == NULL){printf("realloc fail\n");exit(-1);}else{pt->array = tmp;pt->capacity*=2;//容量变成两倍}}pt->array[pt->top] = x;pt->top++;
}

2.3出栈

void StackPop(ST* pt)
{assert(pt);//栈空了,调用top,直接种植程序报错assert(pt->top > 0);pt->top--;
}

2.4取栈顶元素

//取栈顶元素
datatype StackTop(ST* pt)
{assert(pt);assert(pt->top > 0);return pt->array[pt->top - 1];
}

2.5求栈内元素个数

//求栈内元素个数
int StackSize(ST* pt)
{assert(pt);return pt->top;
}

2.6判栈空

//判栈空
bool StackEmpty(ST* pt)//用布尔类型判断
{assert(pt);return pt->top == 0;
}

2.7栈打印

//打印
void StackPrintf(ST pt)//打印时不需要对站内元素进行修改,所以不需要传指针
{while (pt.top){printf("%d ", pt.array[pt.top - 1]);StackPop(&pt);}		
}

2.8栈销毁

//栈销毁
void StackDestory(ST* pt)
{assert(pt);free(pt->array);pt->array = NULL;pt->capacity = pt->top = 0;
}

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int datatype;
typedef struct StackNods
{datatype * array;size_t top;size_t capacity;
}ST;//栈的初始化
void Stackinit(ST *pt)
{assert(pt);pt->array = (datatype*)malloc(sizeof(datatype) * 4);if (pt->array == NULL){printf("malloc fail\n");exit(-1);}pt->capacity = 4;pt->top = 0;
}
//压栈
void StackPush(ST* pt,datatype x)
{assert(pt);ST* tmp=NULL;if (pt->top == pt->capacity)//表示栈满了 -》扩容{tmp = (datatype*)realloc(pt->array, pt->capacity * sizeof(datatype) * 2);if (tmp == NULL){printf("realloc fail\n");exit(-1);}else{pt->array = tmp;pt->capacity*=2;//容量变成两倍}}pt->array[pt->top] = x;pt->top++;
}
//出栈
void StackPop(ST* pt)
{assert(pt);//栈空了,调用Top,直接种植程序报错assert(pt->top > 0);pt->top--;
}
//取栈顶元素
datatype StackTop(ST* pt)
{assert(pt);assert(pt->top > 0);return pt->array[pt->top - 1];
}
//求栈内元素个数
int StackSize(ST* pt)
{assert(pt);return pt->top;
}
//判栈空
bool StackEmpty(ST* pt)
{assert(pt);return pt->top == 0;
}
//
void StackPrintf(ST pt)
{while (pt.top){printf("%d ", pt.array[pt.top - 1]);StackPop(&pt);}	printf("\n");
}
//栈销毁
void StackDestory(ST* pt)
{assert(pt);free(pt->array);pt->array = NULL;pt->capacity = pt->top = 0;
}
int main()
{ST pt;Stackinit(&pt);StackPush(&pt, 1);StackPush(&pt, 1);StackPush(&pt, 2);StackPush(&pt, 3);StackPush(&pt, 4);StackPrintf(pt);printf("栈内元素个数有%d 个",StackSize(&pt));StackDestory(&pt);return 0;
}

以上就是栈的一些基本操作啦,谢谢大家支持!


http://www.ppmy.cn/server/48427.html

相关文章

Servlet基础(续集2)

HttpServletResponse web服务器接收到客户端的http的请求&#xff0c;针对这个请求&#xff0c;分别创建一个代表请求的HttpServletRequest对象&#xff0c;代表响应的一个HttpServletResponse 如果要获取客户端请求过来的参数&#xff1a;找HttpServletRequest如果要给客户端…

【Linux】I/O多路复用

文章目录 I/O多路复用select()select()缺点 poll()poll()缺点 epoll()LT(水平触发模式)ET(边缘触发模式)具体函数 I/O多路复用 多进程和多线程实现并发会消耗大量的资源&#xff0c;主进程/线程用于监听和接受连接&#xff0c;再创建多个子进程/子线程来完成与连接的各个客户端…

阅读论文(十)

论文题目:A novel approach for intelligent diagnosis and grading of diabetic retinopathy 中文题目:一种新的糖尿病视网膜病变智能诊断和分级方法 0摘要 糖尿病视网膜病变(DR)是糖尿病的一种严重的眼部并发症,可导致视力损害甚至失明。目前,传统的深度卷积神经网络…

第5天:Flask应用结构

第5天&#xff1a;Flask应用结构 Flask应用结构简介 随着应用的增长&#xff0c;合理地组织代码变得非常重要。一个清晰的应用结构可以帮助你更有效地管理项目&#xff0c;提高代码的可读性和可维护性。 基本结构 一个典型的Flask应用结构可能包括以下部分&#xff1a; /y…

如何挑选优质的气膜建筑生产厂家—轻空间

随着气膜建筑在各个领域的应用越来越广泛&#xff0c;市场上出现了众多气膜建筑生产厂家。为了确保您选择到高质量的产品和可靠的服务&#xff0c;以下是一些在挑选气膜建筑生产厂家时需要考虑的重要因素。 1. 经验与专业知识 厂家的经验是评估其能力和信誉的重要指标。选择具有…

频率域,空间域以及频率域和空间域如何获取

文章目录 频率域频率域的关键概念&#xff1a;频率域的应用&#xff1a; 空间域空间域特征的含义&#xff1a;空间域操作的常见技术&#xff1a;与频率域的对比&#xff1a; 如何获取空间域&#xff0c;频率域空间域特征&#xff1a;频率域特征&#xff1a; 频率域 频率域&…

SpringBoot:SpringBoot中使用Redisson实现分布式锁

一、前言 Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务。 刚好项目中需要使用到分布式锁&#xff0c;记录一下Redisson是如何使用分布式…

Flutter打包网络问题解决办法

问题情况":app:compileReleaseJavaWithJavac" 报错的最主要问题其实在下一句 Failed to find Build Tools revision 30.0.3,请查看自己的Android sdk版本,比如我的就是’34.0.0’版本. 解决办法: 在app/build.gradle中的android下添加,即可 buildToolsVersion 3…