【数据结构】栈详解

news/2024/7/5 5:26:27

Hello everybody!今天给大家讲讲数据结构中一个比较重要的知识:栈。希望宝子们在看过这篇文章后能够有所收获!

1.栈的概念及结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

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

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

2.实现栈

由于实现栈需要较长的代码,因此我们要像公司中做大型项目一样创建一个头文件:Stack.h和两个源文件:Stack.c Test.c。

头文件中需要包含所需要的库文件,接口的声明,栈的声明。总之就是要我们清晰的看到栈的结构和功能。

而源文件Stack.c需要实现在头文件中声明的函数。

源文件Test.c用于测试栈的功能是否正常。

当然源文件需要包含头文件,这样才能把它们关联起来。

创建三个文件使得代码逻辑更加清晰,有利于后期代码的维护。

2.1接口的声明&栈的声明

栈只需要在栈顶压栈和出栈,综合考虑:以顺序表的方式实现栈最优。

2.2接口的实现

在头文件中我们声明个栈的各种接口,在源文件中,我们需要实现这些接口。

目前我们实现了STInit和STPush两个接口并测试了其功能,一切正常。

这是剩下的接口,思路比较简单。

这是测试后的结果。

3.代码

头文件:

#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int STDataType;//用STDataType代替int。便于以后更改数据类型
typedef struct Stack {
    STDataType* a; //整型指针,用于存放栈中的数据。
    int top;//记录栈顶的位置
    int capacity;//记录栈的容量
}ST;


void STInit(ST* pst);//初始化
void STDestroy(ST* pst);//销毁
void STPush(ST* pst, STDataType x);//压栈
void STPop(ST* pst);//出栈
STDataType STTop(ST* pst);//输出栈顶元素的值
bool STEmpty(ST* pst);//判断栈是否为空
int STSize(ST* pst);//输出栈中有效元素的个数

源文件:

#include "Stack.h"
void STInit(ST* pst) {
	assert(pst);//检验pst是否为空指针
	pst->a = NULL;
	pst->capacity = 0;
	pst->top = -1;//当栈为空的时候栈顶位置为-1。当栈中有一个元素的时候,栈顶位置为0。
}
void STPush(ST* pst, STDataType x) {
	assert(pst);
	if (pst->top + 1 == pst->capacity) {
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;//当容量为0时,赋予4值的个空间,不为零时,按2倍增加
		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);//扩容
		if (tmp == NULL) {//判断扩容是否成功
			perror("realloc fail");
			exit(-1);
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	
	pst->a[pst->top+1] = x;
	pst->top++;
}

void STPop(ST* pst) {
	assert(pst);
	assert(pst->top > -1);
	pst->top--;
}

STDataType STTop(ST* pst) {
	assert(pst);
	assert(pst->top > -1);//判断栈是否为空
	return  pst->a[pst->top];
}

bool STEmpty(ST* pst) {
	assert(pst);
	return pst->top + 1==0;//pst->top+1代表栈中的元素个数,等于0为空,不等于0为非空。
}

int STSize(ST* pst) {
	assert(pst);
	return pst->top + 1;
}

void STDestroy(ST* pst) {
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->top = -1;
	pst->capacity = 0;
}

源文件

#include "Stack.h"
int main() {
	ST plist;
	STInit(&plist);
	STPush(&plist, 1);
	STPush(&plist, 2);
	STPush(&plist, 3);
	STPush(&plist, 4);
	STPush(&plist, 5);
	
	
	
	while (!STEmpty(&plist)) {
		printf("%d", STTop(&plist));
		STPop(&plist);
	}
	STDestroy(&plist);
	return 0;
}

4.结语

看完这篇文章不知道大家是否有收获呢?可以将自己的问题发在评论区!到了数据结构就要经常敲代码呦!只有这样才可以很好的提升自己的能力,最后祝大家都能找到满意的工作!


http://lihuaxi.xjx100.cn/news/1814658.html

相关文章

2023APMCM亚太杯/小美赛数学建模竞赛优秀论文模板分享

一、模板介绍 二、注意事项 将论文划分小节时&#xff0c;应避免在小节中出现大段的文字叙述&#xff0c;这样的叙述会妨碍评委在浏览论文时掌握论文的要点。重要的句子&#xff0c;包括首次定义的概念&#xff0c;用黑体书写。 重要的数学公式应另起新行单独列出。建模所用的…

腾讯云COS+picgo+typora 图床搭建与自动上传

1、腾讯云 COS 腾讯云活动 COS新用户专享 COS 操作步骤 1、点击 创建桶&#xff0c;完善信息 点击下一步&#xff0c;剩下的配置可自己配置 2、picgo 官网地址 2.3.1版本下载地址 现在稳定版本是2.3.1 相关连接 腾讯云密钥设置地址picgo官网地址2.3.1版本下载地址

基于JSP的音乐网站的设计与实现【附源码】

基于JSP的音乐网站的设计与实现摘 要 随着互联网和宽带上网的普及&#xff0c;网络传输以其特有的快速、高效、便捷的传输方式越来越被人们接受。在当今社会的影响下&#xff0c;人们因为快节奏的工作和生活产生了极大的压力&#xff0c;这时就需要一个放松的环境去释放这些压力…

ubuntu linux C/C++环境搭建

目录 前言 1.1 vim安装与配置 ​编辑 1.2 vim配置 1.3 gcc g编译器的安装 与gdb调试器的安装 1.4 写个C/C程序测试一下 1.6 vscode安装 1.7 vscode插件下载​编辑 前言 在开始C之前&#xff0c;我们需要搭建好C的开发环境&#xff0c;我这里使用的操作系统是ubuntu Linux&a…

麒麟KYSEC使用方法03-开启及关闭netctl

原文链接&#xff1a;麒麟KYSEC使用方法03-开启及关闭netctl hello&#xff0c;大家好啊&#xff0c;今天给大家带来麒麟KYLINOS的kysec使用方法系列文章第三篇内容----使用命令开启及关闭netctl&#xff0c;联网控制策略有三种模式&#xff0c;off/enforing/warning&#xff0…

律师网站开发实战案例

最近关于律师的电视剧很火爆&#xff0c;各大卫视也相继播出关于律师类的电视剧&#xff0c;在互联网领域律师也不再是那种遥不可攀&#xff0c;不能触达的领域。今天我们要介绍的是律师行业网站的制作过程&#xff0c;他到底有什么功能点和用处。 律师网站的功能主要包括&…

外贸ERP系统是什么?推荐的外贸管理软件?

外贸ERP管理系统有哪些&#xff1f;海洋建站管理软件的功能&#xff1f; 为了更有效地处理外贸业务&#xff0c;许多企业正在寻找先进的工具和技术。为了提高效率、降低成本并增强竞争力&#xff0c;越来越多的外贸企业正在转向外贸ERP系统。那么&#xff0c;外贸ERP系统究竟是…

C语言——深入理解指针——函数指针

一、函数指针变量 1.1 函数指针变量的创建 什么是函数指针变量呢&#xff1f; 函数指针变量应该是用来存放函数地址的&#xff0c;未来通过地址能够调⽤函数的。 那么函数是否有地址呢&#xff1f; 我们做个测试&#xff1a; #include <stdio.h> void test() {print…