栈(基于动态顺序表实现的栈)

栈的简单介绍

关于栈的性质咳咳

栈:栈是一种特殊的线性表,其中只让在一端插入和删除元素。

后进先出

进行插入删除的那一端叫栈顶,另一端叫栈底

我们实现的栈是基于一个动态顺序表的的栈,会实现栈的   入栈,出栈,获取栈顶元素,获取栈中元素个数,判断栈是否为空(纯c语言版本)

操作的命名如下

栈的信息

这是栈的信息,

接下来初始化

我们在创建好栈的信息后定义一个栈,然后进行初始化,初始时我们可以让栈中放4个元素,在开一段可以放入4个元素的内存,让a指向

初始化

初始化要用到的函数malloc,这个不懂的可以看这个

动态内存管理()-CSDN博客

在我们开空间的化可能会开失败,如果开失败的化,直接把返回的指针给ps->a程序会出现内存问题,所以我们创建一个临时变量,存放新开空间首位置的指针,如果这个指针不为空,就把临时的tmp指针给ps->a。这个操作在后续操作用到,比如在入栈时栈满,我们还要进行一次扩容,所以我们可以写一个扩容函数

入栈

代码如下

判空

判空这个操作实现的功能是如果这个栈里面没有元素的化返回假,有元素返回真

在  Stack.h 中加入#include<stdbool.h>   就可以用布尔类型了,我们的栈中的top

真好就是栈中元素的真是个数-1,因为top,从0开始就有元素了,所以返回 top+1;即可

代码如下

出栈

我们判空操作实现后就方便出栈了

在出栈时需要考虑一个栈是否为空的情况所以直接调用上面的函数特判一下,不为空让top--,就可以了

代码

获取栈顶元素

判断一下不是空,然后返回栈中top指向的元素,代码如下

woc,怎末感觉突然没话讲了,

获取栈中元素个数,栈的销毁

完整的代码


//Stack.h

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<ctype.h>
#include<stdbool.h>
#include<assert.h>
#include<windows.h>


//栈的元素类型
typedef int STaType;


typedef struct Stack
{
	STaType* a;
	int top;//栈顶
	int capacity;//栈满容量
}Stack;


//栈的打印
void Stack_print(Stack p);
//栈中元素的输入
void Stack_scan(STaType* x);
//扩容
void Stack_Check();
//初始化
void Stack_Lnit(Stack* ps);
//入栈,出栈
void Stack_push(Stack* ps, STaType x);
void Stack_pop(Stack* ps);
//获取栈顶元素
STaType Stack_top(Stack* ps);
//获取栈内元素个数
int Stack_size(Stack* ps);
//判空
bool Stack_empty(Stack* ps);
//销毁
void Stack_Destroy(Stack* ps);

//Stack.c

#include"Stack.h"

//typedef struct Stack
//{
//	STaType* a;
//	int top;//栈顶
//	int capacity;//栈满容量
//}Stack;


//栈的打印
void Stack_print(Stack p)
{
	printf("\n现在栈如下\n");

	while (p.top != -1)
	{
		printf("%d\n", p.a[p.top]);
		p.top--;
	}
	printf("\n");
	printf("\n");
}

//栈中元素的输入
void Stack_scan(STaType* x)
{
	scanf("%d", x);
}

//扩容
void Stack_Check(Stack*ps)
{
	assert(ps);
	int x = ps->capacity==0?4:ps->capacity*2;
	if (ps->top == ps->capacity)
	{
		STaType* tmp = (STaType*)malloc(sizeof(STaType)*x);
		assert(tmp);
		ps->a = tmp;
	}
	ps->capacity = x;
}


//初始化
void Stack_Lnit(Stack* ps)
{
	assert(ps);

	ps->capacity = 4;
	ps->top = -1;//栈顶有元素
	STaType *tmp= (STaType*)malloc(sizeof(STaType)*ps->capacity);
	if (tmp != NULL)
		ps->a = tmp;
}

//入栈,出栈
void Stack_push(Stack* ps, STaType x)
{
	assert(ps);
	Stack_Check(ps);//判断扩容
	ps->a[++ps->top] = x;
}


void Stack_pop(Stack* ps)
{
	assert(ps);
	if(!Stack_empty(ps))
		ps->top--;
	else
	{
		printf("栈为空,出栈失败\n");
		return;
	}
}

//获取栈顶元素
STaType Stack_top(Stack* ps)
{
	assert(ps);
	if (Stack_empty(ps))
	{
		printf("栈为空,出栈失败\n");
		return 0;
	}
	return ps->a[ps->top];
}

//获取栈内元素个数
int Stack_size(Stack* ps)
{
	assert(ps);
	return ps->top + 1;
}

//判空
bool Stack_empty(Stack* ps)
{//为空返回真,不为空返回假
	assert(ps);
	return ps->top == -1;
}


//销毁
void Stack_Destroy(Stack* ps)
{
	if (ps->a)
	{
		free(ps->a);
	}
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}



//Text.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"

void enumm()
{
	printf("********************************************************************\n");
	printf("********************************************************************\n");
	printf("********************************************************************\n");
	printf("********************************************************************\n");
	printf("**1  初始化                           2.入栈                                 **************\n");
	printf("**3  出栈                           4.获取栈顶元素                   **************\n");
	printf("**5  获取栈中元素个数       6判空                                 **************\n");
	printf("**7  销毁栈                        0退出                                 **************\n");
	printf("********************************************************************\n");
	printf("*******************************************************************\n");
	printf("********************************************************************\n");
}

void text()
{
	Stack pp;
	enumm();
	do
	{
		int po; scanf("%d", &po);
		switch (po)
		{
		case 1://创
			Stack_Lnit(&pp);
			break;
		case 2://入栈
			STaType x;
			Stack_scan(&x);
			Stack_push(&pp, x);
			Stack_print(pp);
			break;
		case 3://出栈
			Stack_pop(&pp);
			Stack_print(pp);
			break;
		case 4://获取栈顶元素
			STaType xx= Stack_top(&pp);
			printf("%d", xx);
			break;
		case 5://获取栈中元素个数
			int n = Stack_size(&pp);
			printf("%d", n);
			break;
		case 6://判空
			if (!Stack_empty(&pp)) printf("不是空\n");
			else printf("是空\n");
			break;
		case 7://销毁栈
			Stack_Destroy(&pp);
		case 0://退出
			goto xxx;
			break;
		}
		//system("cls");
	} while (1);
xxx:;

}

signed main()
{
	text();
	getchar();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/632976.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python知识点复习

文章目录 Input & OutputVariables & Data typesPython字符串重复&#xff08;字符串乘法&#xff09;字符串和数字连接在一起print时&#xff0c;要强制类型转换int为str用input()得到的用户输入&#xff0c;是str类型&#xff0c;如果要以int形式计算的话&#xff0c…

Dijkstra算法在《庆余年》中的应用:范闲的皇宫之旅

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

C语言 数组——向函数传递数组

目录 把数组传给函数&#xff08;Passing Arrays to Functions&#xff09; 向函数传递一维数组 向函数传递二维数组 数组在学生成绩管理中的应用 例&#xff1a;计算每个学生的平均分 把数组传给函数&#xff08;Passing Arrays to Functions&#xff09; 向函数传递一维…

校园霸凌行为监测AI预警系统

校园霸凌行为监测AI预警系统基于AI视觉智能分析算法&#xff0c;校园霸凌行为监测AI预警系统通过已安装的监控摄像头对校园现场画面进行实时监测。校园霸凌行为监测AI预警系统能够自动识别学生的违规行为&#xff0c;包括打架、跌倒、偷偷翻墙、人员聚众、攀高、抽烟等行为&…

【C++】右值引用 移动语义

目录 前言一、右值引用与移动语义1.1 左值引用和右值引用1.2 右值引用使用场景和意义1.3 右值引用引用左值及其一些更深入的使用场景分析1.3.1 完美转发 二、新的类功能三、可变参数模板 前言 本篇文章我们继续来聊聊C11新增的一些语法——右值引用&#xff0c;我们在之前就已…

马蹄集 oj赛(双周赛第二十七次)

目录 栈的min 外卖递送 奇偶序列 sort 五彩斑斓的世界 括号家族 名次并列 栈间 双端队列 合并货物 逆序对 活动分组 栈的min 难度:黄金巴 占用内存:128 M时间限制:1秒 小码哥又被安排任务了&#xff0c;这次他需要要设计一个堆栈&#xff0c;他除了可以满足正常的栈…

Spring Security整合Gitee第三方登录

文章目录 学习链接环境准备1. 搭建基本web应用引入依赖ThirdApp启动类创建index页面application.yml配置访问测试 2. 引入security引入依赖ProjectConfig访问测试 第三方认证简介注册gitee客户端实现1引入依赖application.yml配置文件创建index.html页面启动类InfoControllerPr…

【openlayers系统学习】3.4波段数学计算(计算NDVI)

四、波段数学计算&#xff08;计算NDVI&#xff09; 我们已经看到了如何使用 ol/source/GeoTIFF​ 源代码来渲染真彩色和假彩色合成。我们通过将缩放的反射率值直接渲染到红色、绿色或蓝色显示通道中的一个来实现这一点。还可以对来自GeoTIFF&#xff08;或其他数据瓦片源&…

javaSwing购物系统项目(文档+视频+源码)

摘要 由Java swing实现的一款简单的购物程序&#xff0c;数据库采用的是mysql&#xff0c;该项目非常简单&#xff0c;实现了管理员对商品类型和商品的管理及用户注册登录后浏览商品、加入购物车、购买商品等功能&#xff0c;旨在学习Java 图形界面开发 系统实现 我们先来管理…

20240516-Flyme AIOS 特种兵发布会

目录 1 Flyme AIOS 2 路演功能 2.1 拖拽流转 2.2 任务剧本自定义 2.3 智能体商店 2.4 实况通知 2.5 AI壁纸 3 MYVU 3.1 翻译功能 3.2 AR导航-骑行 3.3 AI语音转文字-科技向善 3.4 Flyme AR-提词器增强 1 Flyme AIOS 1&#xff09;目标&#xff1a;All in AI&#…

Android:OkHttp网络请求框架的使用

目录 一&#xff0c;OkHttp简介 二&#xff0c;OkHttp请求处理流程 三&#xff0c;OkHttp环境配置 四&#xff0c;OkHttp的使用 1.get网络请求 2.post上传表单数据 3.post上传json格式数据 4.文件上传 5.文件下载 一&#xff0c;OkHttp简介 OkHttp是square公司推出的一…

淘宝api接口是什么意思?api接口申请资格是什么?

淘宝其开放性和灵活性为开发者提供了广阔的创新空间。而淘宝API接口&#xff0c;作为连接淘宝平台与外部应用的桥梁&#xff0c;发挥着至关重要的作用。那么&#xff0c;淘宝api接口是什么意思&#xff1f; 一、淘宝API接口是什么意思&#xff1f; 淘宝API接口&#xff0c;全称…

UNI-APP设置屏幕保持常亮-不熄灭屏幕

前言 最近在实际开发过程中&#xff0c;我们会发现在自己使用的app当中会根据系统无操作熄灭屏幕对于一下需要长时间保持屏幕的业务就很不友好&#xff0c;uni-app也是提供了相应方法加上代码之后-注意app端没报错-不生效就是权限问题-需要设置相对应权限-打自定义包 代码实现…

vue+springboot实现echarts数据图统计

①vue项目修改配置 安装依赖&#xff1a; npm i echarts -S 修改路由index.js&#xff1a; import Vue from vue import VueRouter from vue-router import Manager from ../views/Manager.vue // 解决导航栏或者底部导航tabBar中的vue-router在3.0版本以上频繁点击菜单报错…

【编译原理复习笔记】语法分析-补充(二义性与LR错误处理)

二义性文法的 LR 分析 每个二义性文法都不是 LR 的 但是某些二义性文法更加简短&#xff0c;描述更方便 如 I7 和 I8 具有移进归约冲突 使用优先级和结合性解决冲突 对于 I7&#xff0c;由于乘号优先级高于加号&#xff0c;所以当下一个输入符号为乘号时&#xff0c;我们优…

03-02-Vue组件之间的传值

前言 我们接着上一篇文章 03-01-Vue组件的定义和注册 来讲。 下一篇文章 04-Vue&#xff1a;ref获取页面节点–很简单 父组件向子组件传值 我们可以这样理解&#xff1a;Vue实例就是一个父组件&#xff0c;而我们自定义的组件&#xff08;包括全局组件、私有组件&#xff09;…

Java基础入门day49

day49 tomcat 启动 进入tomcat的bin目录&#xff0c;双击或者运行startup.bat文件启动tomcat 控制台最后出现服务器启动在多少毫米之内&#xff0c;代表服务器成功启动 org.apache.catalina.startup.Catalina.start Server startup in 405 ms 验证tomcat 在浏览器中输入 loca…

linux---进程通信

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、匿名管道 进程之间的通信目的一般是来控制另一个进程。也可以用来实现数据的交流&#xff0c;还有资源共享等。 匿名管道原理&#xff1a; &#xff08;铺垫&#xff09;进程之间是具有独立性&…

超市进销存|基于SprinBoot+vue的超市进销存系统(源码+数据库+文档)

超市进销存系统 目录 基于SprinBootvue的超市进销存系统 一、前言 二、系统设计 三、系统功能设计 1 登录注册 2 管理员功能模块 3员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#x…