首页 > 其他分享 >数据结构 Stack 栈 -- C语言实现

数据结构 Stack 栈 -- C语言实现

时间:2024-08-06 10:09:11浏览次数:14  
标签: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/18344046

相关文章

  • PHP 无限级分类
    1)无限级分类处理<?php//准备分类原始数据$cate_arr=[['id'=>1,'name'=>'电脑','pid'=>0],['id'=>2,'name'=>'手机','pid'=>0],['id'=>3,'nam......
  • 高端玩法之类的装饰器的应用
    一、类的装饰器:defdeco(obj):obj.x=2obj.y=3returnobj@decoclassFoo:passprint(Foo.__dict__)二、类的装饰器增强版defdeco(**kwargs):defwarpper(obj):forkey,valueinkwargs.items():setattr(obj,key,value)......
  • 京准电子:NTP网络时间服务器技术设计原理架构
    京准电子:NTP网络时间服务器技术设计原理架构京准电子:NTP网络时间服务器技术设计原理架构京准电子科技官微——ahjzszNTP网络时间服务器为防火墙内的网络设备、终端、服务器提供准确、可靠和安全的高精度卫星时间参考,可为它支持数万台支持标准的网络时间协议(NTP,含V1/2/3/4)和......
  • 简单设计一个JAVA并行处理工具类
    在工作中,我们肯定遇到过一个接口要处理N多事项导致接口响应速度很慢的情况,通常我们会综合使用两种方式来提升接口响应速度优化查询SQL,提升查询效率开启多线程并发处理业务数据这里讨论第二种方案:使用多线程并发处理业务数据,最后处理完成以后,拼装起来返回给前端,每个人的实现方......
  • python入门(1)基础知识介绍
    print函数a=10print(a)print(10)print("您好")print(a,b,"您好")print(chr(98))#chr将98转换为ASVCII值print("你好"+"上海")#都是字符串可以用+连接输出print('您好',end='不换行')#修改结束符,不换行,否则自动视为有\nfp=open("note.txt&......
  • C++(虚函数实现多态基本原理)
    目录1.概念2.示例3.总结在C++中,加上virtual关键字可以实现多态,这是因为它允许函数在基类和派生类中有不同的实现,并确保在运行时正确调用派生类的方法。具体来说,这种机制称为“动态绑定”或“运行时多态”。1.概念虚函数(VirtualFunction):当你在基类中声明一个函数......
  • VisualSVN Server的迁移
    VisualSVNServer迁移的情况 VisualSVNServer 迁移 涉及到两种情况:第一种情况:VisualSVNServer没有更换电脑或者服务器,只是修改Servername。第二种情况:当VisualSVNServer需要从一台电脑(或者服务器)迁移到另一台电脑(或者服务器)。 VisualSVNServer迁移的方法  Vi......
  • pytorch 模型加载和保存
    模型加载torch.load(f,map_location=None,pickle_module=<module'pickle'from'/opt/conda/lib/python3.6/pickle.py'>,**pickle_load_args) map_location适用于修改模型能在gpu上运行还是cpu上运行。一般情况下,加载模型,主要用于预测新来的一组样本。预测的主要流程包......
  • 数学基础-素数
    算术基本定理任何一个大于\(1\)的正整数\(N\)都能唯一分解为有限个质数的乘积,可写作:\[N=p_1^{c_1}p_2^{c_2}...p_m^{c_m}\]其中\(c_i\)是正整数,\(p_i\)是质数,且满足\(p_1<p_2<...<p_m\)。推论:\(N\)的正约数的集合可写作:\[\{p_1^{b_1}p_2^{b_2}...p_m^{b_m}\}\]其......
  • DASCTF 2023 & 0X401七月暑期挑战赛 MyPicDisk
    打开题目是个登录框这里是XXE盲注boogipop师傅的盲注脚本importrequestsimporttimeurl='http://6562827c-cc7e-4a5e-818d-97f9064dfce0.node4.buuoj.cn:81/index.php'strs='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'flag=''......