前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构初阶:栈的概念和如何模拟栈?

数据结构初阶:栈的概念和如何模拟栈?

作者头像
用户11290664
发布2024-09-25 13:33:13
670
发布2024-09-25 13:33:13
举报
文章被收录于专栏:学习

每日一问。 今天学习了吗?

一.栈 1.栈的概念及结构

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

为了更形象地了解栈的形象我们要了解2个概念 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

如图我们先录入数据1在栈底,然后再录入2,3和新的数据最新录入的数据就是栈顶的位置。

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

此时我们要移除数据就只能从栈顶先移除。

这一步严格对应了前面的LIFO(Last In First Out)先进后出的原则。

2.模拟栈的实现 那么我们如何来实现模拟栈的实现呢?

有两种结构和次类似,链表和数组,但是相比较来说数组的结构更加优良,因为。因为数组在尾上插入数据的代价比较小。

直接来写代码

sq.h

代码语言:javascript
复制
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
#include<stdlib.h>

typedef int SLTypeDate;
typedef struct Stack
{
	SLTypeDate* a;
	int top;
	int capacity;

}SL;

首先我们先定义一个Stack结构体,里面存放了a指针,栈顶位置top方便操作,以及空间大小以便存放数据。然后把他改为SL方便操作。

下面是方法

代码语言:javascript
复制
void SLInite(SL* pst);//初始化
void SLDestroy(SL* pst);//销毁
void SLPush(SL* pst,SLTypeDate x);//插入数据
void SLPop(SL* pst);//删除栈顶数据
SLTypeDate SLTop(SL* pst);//返回栈顶数据
bool SLEmpty(SL* pst);//判断为空
int  SLSize(SL* pst);//获取数据大小

下面是方法的具体实现

sq,c

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1
#include"Sq.h"
void SLInite(SL* pst) {//初始化
	assert(pst);
	pst->a = NULL;
	pst->capacity = pst->top = 0;




}
void SLDestroy(SL* pst) {//销毁

	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = pst->top = 0;



}
void SLPush(SL* pst, SLTypeDate x) {//插入数据

	if (pst->top==pst->capacity) {

		int newdate = pst->capacity==0?4:pst->capacity*2;
		SLTypeDate* tem = (SLTypeDate*)realloc(pst->a, sizeof(SLTypeDate) * newdate);
		if (tem == NULL) {


			perror("fail");
			return;
		}
		pst->a = tem;
		pst->capacity = newdate;


	}

	pst->a[pst->top] = x;
	pst->top++;

}
void SLPop(SL* pst) {//删除栈顶数据

	assert(pst);
	pst->top--;

}
SLTypeDate SLTop(SL* pst) {//返回栈顶数据
	
	assert(pst);

		return pst->a[pst->top-1];	

}
 bool SLEmpty(SL* pst) {//判断为空

	 assert(pst);
	 return pst->top == 0;

}
int  SLSize(SL* pst) {//获取数据大小
	assert(pst);
	return pst->top;

}

下面是测试

test,c

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS 1
#include"Sq.h"





int main() {
	SL aa;
	SLInite(&aa);
	SLPush(&aa, 1);
	SLPush(&aa, 2);
	SLPush(&aa, 3);
	SLPush(&aa, 4);

	SLPush(&aa, 4);
	SLPush(&aa, 1);


	printf("这个栈帧的大小是%d ", SLSize(&aa));
	printf("栈顶元素是%d\n", SLTop(&aa));
	while (!SLEmpty(&aa))
	{
		printf("%d ",SLTop(&aa));
		aa.top--;
	}


	SLDestroy(&aa);



	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档