首页 > 其他分享 >Stack 栈 -- C语言实现

Stack 栈 -- C语言实现

时间:2024-08-06 12:06:54浏览次数:11  
标签:ps -- top C语言 assert void STDataType Stack

栈的概念

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

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

顺序栈代码实现

Stack.h

#define _CRT_SECURE_NO_WARNINGS 1

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

//顺序表实现	

typedef int STDataType;

typedef struct Stack
{
	STDataType *a; 
	int top;         //栈顶位置
	int capacity;    //栈容量
}Stack;//缩写ST

//都用一级指针实现
//对栈元素初始化
void StackInit(Stack *ps);

void StackDestroy(Stack *ps);

void StackPush(Stack *ps, STDataType x);

void StackPop(Stack *ps);

STDataType StackTop(Stack *ps);

bool StackEmpty(Stack *ps);

int StackSize(Stack *ps);

Stack.c


#include"Stack.h"	

void StackInit(Stack *ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

void StackDestroy(Stack *ps)
{
	assert(ps);
	if (ps->a)//非空,有空间占用再释放
	{
		free(ps->a);
	}
	ps->top = 0;
	ps->capacity = 0;
	ps->a = NULL;
}

void StackPush(Stack *ps,STDataType x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		STDataType *tmp = (STDataType *)realloc(ps->a, newcapacity*sizeof(STDataType));
			if (tmp == NULL)
			{
			perror("realloc fail");
			exit(-1);
			}
			ps->capacity = newcapacity;
			ps->a = tmp;
	}
	ps->a[ps->top++] = x;
	//ps->top++;
}

void StackPop(Stack *ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	ps->top--;
}

STDataType StackTop(Stack *ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	return ps->a[ps->top - 1];
}

bool StackEmpty(Stack *ps)
{
	assert(ps);
	return ps->top == 0;//真(非零):返回tree。假(零):返回false
}

int StackSize(Stack *ps)
{
	assert(ps);
	return ps->top;
}


标签:ps,--,top,C语言,assert,void,STDataType,Stack
From: https://www.cnblogs.com/DSCL-ing/p/18343985

相关文章

  • navicat [IM002][Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱
    1.情景展示使用navicat连接SQLServer数据库,报错信息如下:[IM002][Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序(0)2.解决方案方案1找到Navicat的安装路径,然后找到sqlncli_x64.msi文件并安装,安装成功后重启Navicat重新进行连接,看是否成功。......
  • python绘制圆柱体
     importosimportrandomimportnumpyasnpimportmatplotlib.pyplotasplt#合成管道数据集defplot_cylinder(center,radius,height,num_points=100):#生成圆柱体的侧面点坐标theta=np.linspace(0,2*np.pi,num_points)intervalZ=np.floor(h......
  • linux 扩容
    工具fdisk只支持MBR分区模式parted同时支持MBR和GPT分区扩容在线扩容partedroot@kzf:~#lsblkNAMEMAJ:MINRMSIZEROTYPEMOUNTPOINTSsda8:00446.6G0disk├─sda18:101G0part/boot/efi└─sda28:2092.1G0part/parted/dev/sdaresizep......
  • 【日记】为啥家族原发性高血压的人还喜欢喝酒啊……(442 字)
    正文今天跟人吵了一下午架,因为有一张报表换了新表,所有人都不知道怎么报。上级行一个想法,我一个想法。吵完都发现对方说得有道理,于是决定明天问省分行。难绷。草台班子。鱼儿说他最近喜欢上了喝酒。我们劝他的同时,我想起来前两天和斯逛超市。本来我觉得高兴,也想着拿一瓶......
  • 如何调整 PDF 文件大小
    你有没有遇到过一个似乎需要很长时间才能下载或通过电子邮件发送的PDF?大文件大小可能是一个真正的负担,尤其是在处理包含图像的文档时。这些图像虽然通常对信息至关重要,但会显着增加整体PDF大小。斗争是真实的!但不要害怕,有一些方法可以简化您的PDF并使其更易于管理。我们将......
  • 详细介绍c语言函数
    今天带大家学习c语言的函数文章目录1.函数的概念2.库函数3.自定义函数语法形式4.形参和实参5.return语句6.数组做函数参数7.嵌套调用和链式访问嵌套调用链式访问8.函数的声明和定义9.static和extern练习练习1.写一个函数判断一年是否是闰年。代码运行结......
  • jsp码头船只出行及配套货柜码放管理系统的设计与实现
    点击下载源码jsp码头船只出行及配套货柜码放管理系统的设计与实现摘要伴随着全球化的发展,码头的物流和客运增多,码头业务迎来新的高峰。然而码头业务的增加,导致了人员成本和工作量的增多。为了解决这一基本问题,码头船只出行及配套货柜码放管理系统应运而生。此次码头船只......
  • 28岁,想转行网络安全(做到老的那种)行得通吗?
    你是否曾对网络安全工程师的就业范围感到困惑?许多人认为,这个行业仅仅是与计算机和网络打交道,但实际上,网络安全工程师的就业范围远不止于此。今天,让我们一起揭开这个神秘面纱,看看网络安全工程师的就业范围究竟有多广阔!企业内部网络安全网络安全工程师在企业内部可以担任至......
  • 月薪 27K,年薪 40 的甲方网络安全负责人面试题(二面)上
    二面相比于一面,比较偏向于技术方向,由于篇幅原因,预计会分2到3次发出。Fastjson反序列化漏洞是哪个版本,能说一下它的原理和修复方式吗,修复之后还有其他绕过方式吗?我们常说的最经典的FastJson反序列化漏洞是1.2.22-1.2.24版本的。FastJson它本身有一个叫做自省的......
  • IAP 程序升级原理
    参考见:IAP升级资料收集-CSDN博客一、IAP是什么?        IAP(InApplicationProgramming,在应用编程)是一种技术,它允许在设备运行过程中通过软件对固件进行更新。这种更新方式不需要使用特殊的硬件编程器或者移除芯片,因此也被称为在线编程或空中下载技术(OTA,Over-The-A......