当前位置: 首页 > article >正文

数据结构----栈

1.

1.1栈的概念及结构

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

压栈:栈的插入操作叫做进栈 / 压栈 / 入栈, 入数据在栈顶
出栈:栈的删除操作叫做出栈。 出数据也在栈顶
注意:栈后进先出

2.栈的实现

栈的实现一般可以使用 数组或者链表实现 ,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的 代价比较小。

1.栈的初始化

定义栈顶有两种情况:1.栈顶指向元素 2.栈顶指向元素下一个一个位置

//初始化
void STInit(ST* ps)
{
	assert(ps);
	//top指向栈顶等于栈顶下一个元素
	ps->top = 0;

	ps->a = NULL;
	ps->capcity = 0;
	//top指向栈顶的元素
	//ps->top=-1
}

2.栈的销毁

void StDestroy(ST* ps)//销毁
{
	assert(ps);
	ps->capcity = ps->top = 0;
	free(ps->a);
	ps->a = NULL;
}

3.入栈

void STPush(ST* ps, STDataType x)//入栈
{
	assert(ps);
	if (ps->capcity == ps->top)
	{
		int newcapcity = ps->capcity = 0 ? 4 : ps->capcity * 2;
		STDataType* temp = (STDataType*)realloc(ps->a, newcapcity * sizeof(STDataType));
		if (temp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		ps->a = temp;
		ps->capcity = newcapcity;
	}
	ps->a[ps->top++] = x;
}

4.出栈

void STPop(ST* ps)//出栈
{
	assert(ps);
	assert(ps->top > 0);
	//return ps->a[ps->top--];
	ps->top--;
}

5.获取元素个数

//获取元素个数
int STSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

6.获取栈顶数据

//获取栈顶数据
STDataType STTop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	return ps->a[ps->top - 1];
}

7.判空

//判空
bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

3.完整代码

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int capcity;
	int top;
}ST;
//初始化和销毁
void STInit(ST* ps);
void StDestroy(ST* ps);

//入栈和出栈
void STPush(ST* ps, STDataType x);
void STPop(ST* ps);

//获取个数
int STSize(ST* ps);

//获取栈顶数据
STDataType STTop(ST* ps);

//判空
bool STEmpty(ST* ps);

#include"Stcak.h"
//初始化
void STInit(ST* ps)
{
	assert(ps);
	//top指向栈顶等于栈顶下一个元素
	ps->top = 0;

	ps->a = NULL;
	ps->capcity = 0;
	//top指向栈顶的元素
	//ps->top=-1
}
void StDestroy(ST* ps)//销毁
{
	assert(ps);
	ps->capcity = ps->top = 0;
	free(ps->a);
	ps->a = NULL;
}
void STPush(ST* ps, STDataType x)//入栈
{
	assert(ps);
	if (ps->capcity == ps->top)
	{
		int newcapcity = ps->capcity = 0 ? 4 : ps->capcity * 2;
		STDataType* temp = (STDataType*)realloc(ps->a, newcapcity * sizeof(STDataType));
		if (temp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		ps->a = temp;
		ps->capcity = newcapcity;
	}
	ps->a[ps->top++] = x;
}
void STPop(ST* ps)//出栈
{
	assert(ps);
	assert(ps->top > 0);
	//return ps->a[ps->top--];
	ps->top--;
}
//获取元素个数
int STSize(ST* ps)
{
	assert(ps);
	return ps->top;
}
//获取栈顶数据
STDataType STTop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	return ps->a[ps->top - 1];
}

//判空
bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

#include"Stcak.h"
void test()
{
	ST sl;
	STInit(&sl);
	STPush(&sl, 1);
	STPush(&sl, 2);
	STPush(&sl, 3);
	while (!STEmpty(&sl))
	{
		printf("%d ", STTop(&sl));
		STPop(&sl);
	}
}
int main()
{
	test();
	return 0;
}


http://www.kler.cn/a/614781.html

相关文章:

  • 记录vite引入sass预编译报错error during build: [vite:css] [sass] Undefined variable.问题
  • resnet网络迁移到昇腾执行(OM上篇)
  • 基于三维数字图像相关(DIC)全场应变测量技术的基础设施结构健康监测与安全评估方法研究
  • 探索Scala基础:融合函数式与面向对象编程的强大语言
  • 【人工智能】解锁大模型潜力:Ollama 与 DeepSeek 的分布式推理与集群部署实践
  • 智慧养老线上线下联动:重构多样化养老服务的创新实践
  • 【Qt】数据库管理
  • 从零开始研发GPS接收机连载——19、自制GPS接收机的春运之旅
  • WebSocket通信的握手阶段
  • 图像数据增强教程:为目标检测任务准备数据
  • 【可视化教程】密码验证(栈)【算法竞赛】
  • 业务流程先导及流程图回顾
  • hugo+github pages 部署实验室网站
  • 用 pytorch 从零开始创建大语言模型(三):编码注意力机制
  • Ubuntu 22.04 安装向日葵远程控制
  • linux系统中fstab 各字段详细说明
  • 【初阶数据结构】线性表之双链表
  • API 请求需要证书认证? 如何在 Postman 中正确配置和使用?
  • ESP-01模块连接手机热点问题及解决方法
  • 【蓝桥杯14天冲刺课题单】Day 1