数据结构学习——顺序栈和链式栈的简单实现和解析(C语言版)

2023-11-11

一、概念

本篇所讲解的栈和队列属于逻辑结构上的划分。逻辑结构分为线性结构、非线性结构

  • 线性结构:有且仅有一个开始节点和一个终端节点,每个节点最多只有一个直接前驱和一个直接后继。代表结构:栈、队列
  • 非线性结构:一个节点可能有多个直接前驱和多个直接后继。代表结构:树、图

堆栈(英语:stack)又称为栈或堆叠,是计算机科学中的一种抽象数据类型,只允许在有序的线性数据集合的一端(称为堆栈顶端,英语:top)进行加入数据(英语:push)和移除数据(英语:pop)的运算。因而按照后进先出(LIFO, Last In First Out)的原理运作。

  • 栈的主要特点就是LIFO(Last In First Out,后进先出),并且程序只能操作栈的一端,被操作的一端叫做栈顶(Top)。所以栈的使用非常简单,但是实现的功能却非常强大
  • 栈的主要操作有两个:入栈(push)、出栈(pop)

二、入栈(push)

在这里插入图片描述

  • 如图所示,栈就像一个瓶子,只有一个口。三个元素A、B、C先后入栈,先入栈的放在底部,后入栈的放在上面

三、出栈(pop)

在这里插入图片描述

  • 根据图示,栈顶的元素最先出栈。这与入栈的顺序刚好相反,入栈顺序是A->B->C,出栈顺序是C->B->A。也就是说:栈是LIFO(Last In First Out,后进先出的)
  • 看似简单的栈,应用十分广泛。操作系统的函数调用、各类编辑器的撤销操作的实现都离不开栈。

栈有两种实现方式:顺序栈链式栈

四、顺序栈简单实现

用数组实现栈,就是将数组的增、删操作限制在头部或者尾部,即只能在数组的一端操作元素,就成了顺序栈

前提准备:

typedef char ElementType;			//	进栈数据为字符型
typedef struct SNode {
	
	ElementType Data[MAXSIZE];		//	存放数据
	int Top; // 当前栈存放的数组的最大下标
	
}SNode;

typedef struct SNode* Stack;

(1)进栈操作

void Push(Stack PtrS, ElementType item) {	//	进栈 

	// 满的堆栈 Top == MAXSIZE - 1
	// 判断栈是否满
	if (PtrS->Top == MAXSIZE - 1) {
		printf("堆栈满\n");
	//	return Ptrs;
	}
	else {
		PtrS->Data[++(PtrS->Top)] = item;
	//	return;
	}
}

(2)出栈操作

ElementType Pop(Stack PtrS) {		//	出栈 
	
	// 空的的堆栈 Top == -1
	// 出栈需要判断 堆栈是否为空
	if (PtrS->Top == - 1) {
		printf("堆栈空\n");
		return -1;// ERROR 是 ElementType 的特殊值,标志错误
	}
	else {
		return PtrS->Data[(PtrS->Top)--];
	}
}

完整代码:

#define _CRT_SECURE_NO_WARNINGS 1

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

#define MAXSIZE 10				//	设定栈的大小,以10个为例
#define ERROR NULL;	

//typedef int ElementType;
typedef char ElementType;			//	进栈数据为字符型
typedef struct SNode {
	
	ElementType Data[MAXSIZE];		//	存放数据
	int Top; // 当前栈存放的数组的最大下标
	
}SNode;

typedef struct SNode* Stack;

void Push(Stack PtrS, ElementType item);// 压栈
ElementType Pop(Stack PtrS);// 出栈

void Init_Memu()			//	功能菜单 
{
	printf("******************************\n");
	printf("*        1.入栈              *\n");
	printf("*        2.出栈              *\n");
	printf("*        3.取栈顶元素        *\n");
	printf("*        4.判断是否栈空      *\n");
	printf("*        5.退出系统         *\n");
	printf("******************************\n");
	
} 

int Chose_GongNeng()		//	选择功能 
{
	int i;
	printf("请选择你要实现的功能 : \n"); 
	scanf("%d",&i);
	return i;
	
} 

int main() {
	
	struct SNode ptr;		//	创建个结构体对象 
	int num;
	ptr.Top = -1;			//	栈空的标记符 为 -1
	while(1)
	{	
		Init_Memu();
		num = Chose_GongNeng();
		
		switch(num)
		{
			case 1:			//	入栈功能 
				{	
				//	int data;
					char data;
					ptr.Top = -1;
					while( ptr.Top != MAXSIZE-1 )
					{	
						printf("请输入数据 :\n");
						getchar();
						scanf("%c",&data);
					
					//	printf("count = %d\n",count);
						
						Push(&ptr,data);
						printf(" Top = %d\n",ptr.Top);
					} 
					
				}
				break;
				
			case 2:			//	出栈功能 
				{	
				//	int Pop_Data = 0;
					char Pop_Data = '0';	
					while(1){
						Pop_Data = Pop(&ptr);
						if(ptr.Top == -1){
							printf("出栈完毕,现在栈为空栈\n");
							break;
						}else{
							printf("出栈数据为 : %c \n",Pop_Data);
						}
						
					}
					
					
				}
				break;
				
			case 3:			//	取栈顶元素 
				{	if(ptr.Top == -1){
						printf("出栈完毕,没有数据\n"); 
					}else{
						printf("栈顶的数据为: %c \n",ptr.Data[ptr.Top]);
					}
					
					 
				}
				break;
				
			case 4:			//	判断栈是否为空 
				{
					if(ptr.Top == -1){
						printf("此栈为空栈\n"); 
					}else{
						printf("此栈已经插入数据\n");
					}
				}
				break;
			
			case 5:			//	退出系统 
				printf("\n谢谢你的使用\n");
				exit(-1);
					
			default:
				printf("没有这个功能,请重新选择\n");
			 	break; 
		}
	}

	return 0;
}

void Push(Stack PtrS, ElementType item) {	//	进栈 

	// 满的堆栈 Top == MAXSIZE - 1
	// 判断栈是否满
	if (PtrS->Top == MAXSIZE - 1) {
		printf("堆栈满\n");
	//	return Ptrs;
	}
	else {
		PtrS->Data[++(PtrS->Top)] = item;	//	进栈数据,记录并改变标记符Top
	//	return;
	}
}

ElementType Pop(Stack PtrS) {		//	出栈 
	
	// 空的的堆栈 Top == -1
	// 出栈需要判断 堆栈是否为空
	if (PtrS->Top == - 1) {
		printf("堆栈空\n");
		return -1;// ERROR 是 ElementType 的特殊值,标志错误
	}
	else {
		return PtrS->Data[(PtrS->Top)--];	//	出栈数据,记录并改变标记符Top
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构学习——顺序栈和链式栈的简单实现和解析(C语言版) 的相关文章

  • 如何画好『数据流图』和『业务流程图』

    前言 数据流图 Data Flow Diagram DFD 是一种便于用户理解和分析系统数据流程的图形工具 他摆脱了系统和具体内容 精确的在逻辑上描述系统的功能 输入 输出和数据存储等 是系统逻辑模型的重要组成部分 一 数据流图组成部分 数
  • (深度学习)Pytorch实现MLP并在MNIST数据集上验证

    Pytorch实现MLP并在MNIST数据集上验证 1 综述 2 MNIST数据集 3 代码细节说明 4 详细代码 综述 PyTorch实现MLP并在MNIST数据集上验证 是我所上的模式识别与深度学习课程的第一个实验 主要是给我们练练手熟
  • 进阶自动化测试,你一定要知道的...

    自动化测试指软件测试的自动化 在预设状态下运行应用程序或系统 预设条件包括正常和异常 最后评估运行结果 将人为驱动的测试行为转化为机器执行的过程 自动化测试框架一般可以分为两个层次 上层是管理整个自动化测试的开发 执行以及维护 在比较庞大的

随机推荐

  • 搭建LightPicture开源免费图床系统「公网远程控制」

    文章目录 1 前言 2 Lightpicture网站搭建 2 1 Lightpicture下载和安装 2 2 Lightpicture网页测试 2 3 cpolar的安装和注册 3 本地网页发布 3 1 Cpolar云端设置 3 2 Cpo
  • 2021年漳州三中高考成绩查询,漳州高中学校实力排名,2021年漳州所有的高中分数线排名...

    2018年漳州市重点高中排名 排名学校名称人气所在市类型 1漳州三中1585漳州市省级示范高中 2漳浦道周中学1403漳州市省级示范高中 3诏安县第一中学1377漳州市省级示范高中 4福建省龙海第一中学1267漳州市省级示范高中 5福建省漳
  • Niginx

    基础 流程 分为正向代理和反向代理 在反向代理中 访问地址被nginx所拦截 而后 转发到其他位置 通过server进行处理 其中 server name和listen用来匹配服务器 不针对其后的具体路径 server匹配成功后 通过rew
  • linux ffmpeg开发环境搭建(基于ubuntu14.04和ffmpeg3.2)

    本文将介绍ffmpeg开发环境的安装测试和更新的步骤 基于ubuntu14 04和ffmpeg3 2 1 安装x264 1 libx264需要yasm 所以先安装yasm sudo apt get install yasm 2 安装libx
  • 修改jar包package目录结构操作方法

    开发中会遇到用第三方的jar包 有时候会出现不同的jar包 包名一致的情况 这就会引发运行时异常 找不到相应的jar包 这种问题时常困扰我们很长时间 下面提出一种解决办法 例如gson jar 1 新建一个文件夹 2 将要修改的jar包放到
  • 解读网易财报:游戏营收创新高,在线教育扬眉吐气?

    近期 不少中概股已相继对外发布新一季财报 5月18日 国内互联网巨头网易公布了2021年一季度业绩报告 从一季度的业绩表现而言 网易营收实现了新增长 超出市场及分析师的预期 在净利方面 摆脱了连续两个季度的负增长 亦超出分析师预期 受财报利
  • 读写.ini文件

    读写 ini文件 零 前言 一 写 二 读 总 零 前言 ini文件是程序的配置文件 它用来记录历史信息 界面信息 用户操作等 当然除了ini文件可以保存信息 其它文件也可以保存操作的 json txt csv等 如果数据比较少且读写不频繁
  • 机器学习算法总结--线性回归和逻辑回归

    1 线性回归 简述 在统计学中 线性回归 Linear Regression 是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析 这种函数是一个或多个称为回归系数的模型参数的线性组合 自变量都是一次
  • ChatGPT报错“Too many requests in 1 hour.Try again later“

    一 出现 Too many requests in 1 hour Try again later 怎么回事 如果您在使用ChatGPT时出现了 Too many requests in 1 hour Try again later 一小时内
  • 24张架构图把数据治理核心内容讲透了

    前言 随着信息革命和信息化的飞速发展 计算机数据量的急剧增长 数据利用和管理的重要性与日俱增 数据逐渐在信息化这个大舞台上扮演着越来越重要的角色 数据治理是企业大数据基础 企业级数据平台助力企业数字化转型 在目前数字化转型大趋势的推动下 企
  • 【机试题(实现语言:python3)】字符串运用-密码截取(最长回文子串)

    题目描述 给定一个仅包含小写字母的字符串 求它的最长回文子串的长度 所谓回文串 指左右对称的字符串 所谓子串 指一个字符串删掉其部分前缀和后缀 也可以不删 的字符串 注意 记得加上while处理多个测试用例 输入描述 输入一个仅包含小写字母
  • Qt编程 (一)

    一 Qt简介 1 Qt是什么 图形用户程序框架 是对底层应用编程接口API面向对象的封装 是一套基于C 语言的类库 专注但不局限于图形用户界面的开发 也可以进行系统调用 网络编程 数据库 2D 3D图形处理 特点 跨平台 支持Linux W
  • hosts文件被删除了如何解决

    一 给etc目录授权 进入c windows system32 drivers etc 选中etc目录 右键 属性 高级 二 恢复hosts文件 进入目录C Windows System32 drivers etc 新建hosts txt
  • python三次样条插值拟合的树行线_R语言:样条回归

    01 解决何种问题 线性回归都知道是用来描述两个变量之间的线性关系 比如身高和体重 自变量身高每增加1个单位 因变量体重就变化多少 但是现实中能用线性回归描述的情况太少了 绝大部分关系都是非线性关系 这个时候就必须用其他回归来拟合了 例如类
  • 面向对象基础2-关键字

    目录 前言 一 private关键字 二 private关键字的使用 三 this关键字 四 public关键字 五 protected 六 default 总结 前言 一 private关键字 private属于私有访问权限 用于修饰类的
  • ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type

    1 问题描述 ubuntu系统中安装好anaconda后 又继而安装了ROS 并通过命令 pip install opencv python 安装opencv的情况下 此时安装的opencv python包是存放在anaconda下的 而在
  • Linux中的一些指令及./详解

    在 Linux 中有许多常见的指令用于执行各种任务 以下是一些常见的 Linux 指令及其用法的总结 ls 列出目录中的文件和子目录 用法 ls 选项 目录 cd 改变当前工作目录 用法 cd 目录 pwd 显示当前工作目录的路径 用法 p
  • js逆向案例三

    目录 零 概述 一 请求参数 Cookie Referer校验 二 参数响应加密解密AES DES RSA 三 其它js混淆 1 案例7 百变ip eval 2 案例8 聚合图床 sojson v6 3 案例9 SH行政处罚 sojson
  • varest插件使用

  • 数据结构学习——顺序栈和链式栈的简单实现和解析(C语言版)

    数据结构 栈的简单解析和实现 一 概念 二 入栈 push 三 出栈 pop 四 顺序栈简单实现 1 进栈操作 2 出栈操作 一 概念 本篇所讲解的栈和队列属于逻辑结构上的划分 逻辑结构分为线性结构 非线性结构 线性结构 有且仅有一个开始节