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

数据结构——栈的简单解析和实现
  • 一、概念
  • 二、入栈(push)
  • 三、出栈(pop)
  • 四、顺序栈简单实现
    • (1)进栈操作
    • (2)出栈操作

一、概念

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

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

堆栈(英语: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;			//	栈空的标记符 为 -1while(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}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

综合项目---博客

一.运行环境 192.168.32.132 Server-Web linux Web 192.168.32.133 Server-NFS-DNS linux NFS/DNS 基础配置 1.配置主机名静态ip 2.开启防火墙并配置 3.部分开启selinux并配置 4.服务器之间通过阿里云进行时间同步 5.服务器之间实现ssh免密…

SpringCloud-Ribbon:负载均衡(基于客户端)

6. Ribbon&#xff1a;负载均衡(基于客户端) 6.1 负载均衡以及Ribbon Ribbon是什么&#xff1f; Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。简单的说&#xff0c;Ribbon 是 Netflix 发布的开源项目&#xff0c;主要功能是提供客户端的软件负…

Flask基础学习2

连接mysql数据库测试(专业版) [注意1&#xff1a;要导入text库&#xff0c;否则可能出现找不到select 1错误] [注意2&#xff1a;若出现下列问题&#xff0c;可按照模板代码的顺序db SQLAlchemy(app) 的位置] RuntimeError: Either SQLALCHEMY_DATABASE_URI or SQLALCHEMY_B…

MMKV:轻巧高效的跨平台键值存储解决方案

MMKV&#xff1a;轻巧高效的跨平台键值存储解决方案 引言 在移动应用的开发中&#xff0c;数据存储是一个至关重要的环节。随着移动应用的普及和功能的增多&#xff0c;应用需要存储和管理各种类型的数据&#xff0c;包括用户配置信息、缓存数据、临时状态等。传统的数据存储…

acwing14期周赛---------安排时间(贪心+枚举)

贝茜独立经营着一家餐厅&#xff0c;她一天的营业时间可以分为 n 个时段&#xff0c;编号 1∼n。 在这一天的营业中&#xff0c;她一共接收到了 m 个客人的预约用餐订单&#xff0c;编号 1∼m。 其中&#xff0c;第 i 个订单的相关信息如下&#xff1a; 贝茜在第 si个时段接到该…

python巧用定理判断素数

目录 判断一个数n是否是素数 求一个数的素因数个数 求大于等于指定数的最小素数 在数论中有三个非常重要的关于素数的定理 1、任何数都可以表示成若干个素数的乘积 2、任意数的一个素因子如果小于根号n&#xff0c;那么另一个与其对应的素因子必然大于根号n。 3、除了2和…

求小数的某一位(c++题解)

题目描述 分数化为小数后&#xff0c;小数点后第位的数字是多少&#xff1f; 输入格式 三个正整数&#xff0c;相邻两个数之间用单个空格隔开。 输出格式 一个数字。 样例 输入样例 复制1 2 1输出样例 复制5 ______________________________________________________…

pytorch张量和numpy数组相互转换

pytorch张量和numpy数组相互转换 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;将numpy数组转换为Pytorch张量&#x1f333;1. 功能介绍2. 用法 &#x1f333;将Pytorch张量转换为numpy数组&#x1f333;1. 功能介绍2. 用法 &#x1f333;P…

使用python写一个二叉树

可以使用Python的类来实现二叉树&#xff0c;每个节点包括一个值和指向左右子节点的引用。 class Node:def __init__(self, value):self.value valueself.left Noneself.right Noneclass BinaryTree:def __init__(self, root):self.root Node(root)def insert(self, value…

浅谈应该遵守的伦敦银交易规则

做伦敦银投资的朋友应遵守伦敦银交易规则&#xff0c;伦敦银交易规则不是指那些伦敦银交易技巧&#xff0c;而是在这个市场中要遵循的一些约定&#xff0c;下面我们就来讨论一下。 风险管理。风险管理即指投资者控制自己一笔乃至整体交易的风险&#xff0c;没有风险管理意识的投…

JavaSE——方法(1/2)-介绍、方法的各种形式、使用的要求

目录 方法的介绍 方法的其他形式 方法使用的要求 方法的介绍 方法是什么 方法是一种语法结构&#xff0c;它可以把一段代码封装成一个功能&#xff0c;以便重复调用。 方法的完整格式 修饰符 返回值类型 方法名 ( 形参列表 ) { 方法体代码(需要执行的功能代码) return…

OpenCV-36 多边形逼近与凸包

目录 一、多边形的逼近 二、凸包 一、多边形的逼近 findContours后的轮廓信息countours可能过于复杂不平滑&#xff0c;可以用approxPolyDP函数对该多边形曲线做适当近似&#xff0c;这就是轮廓的多边形逼近。 apporxPolyDP就是以多边形去逼近轮廓&#xff0c;采用的是Doug…

面试经典150题——三数之和

​"The road to success and the road to failure are almost exactly the same." - Colin R. Davis 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力方法 因为三个数相加为0&#xff0c;那么说明其中两个加数的和与另一个加数为相反数则满足题意。所以可以得到…

ClickHouse时区

clickhouse数据库的时间是UTC时间。服务器默认的是上海时间。 sudo vim /etc/clickhouse-server/config.xml clickhouse默认的时区是注释的就是UTC时间 %F 表示日期&#xff0c;格式为 YYYY-MM-DD。%T 表示时间&#xff0c;格式为 HH:MM:SS。 因此&#xff0c;formatDateT…

主干网络篇 | YOLOv5/v7 更换主干网络为 VGG13 / VGG16 / VGG19 | 对比实验必备

论文地址:https://arxiv.org/pdf/1409.1556.pdf 在这项工作中,我们研究了卷积网络深度对其在大规模图像识别环境中准确性的影响。我们的主要贡献是对使用非常小(33)卷积滤波器的架构的不断增加深度的网络进行了彻底评估,这表明通过将深度推进到16-19个权重层,可以在先前…

第72讲后台管理Container布局实现

新建layout目录 登录成功后&#xff0c;跳转layout布局容器页面 login页面&#xff1a; 导入router import router from "/router";登录成功&#xff0c;跳转后台管理页面 选用布局容器&#xff1a; <template><div class"common-layout">…

javaweb物业管理系统jsp项目

文章目录 物业管理系统一、系统演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 物业管理系统 可用作javaweb项目、servlet项目、jsp项目的项目设计 一、系统演示 物业管理系统 二、项目介绍 语言&a…

Vue3中Setup概述和使用(三)

一、引入Setup 1、Person.Vue 与Vue3编写简单的App组件(二) 中的区别是&#xff1a;取消data、methods等方法,而是将数据和方法定义全部放进setup中。 <template><div class"person"><h1>姓名:{{name}}</h1><h1>年龄:{{age}}</h…

SQL、Hive中的SQL和Spark中的SQL三者联系与区别

SQL、Hive中的SQL和Spark中的SQL&#xff08;即SparkSQL&#xff09;都是用于处理和分析数据的查询语言&#xff0c;但它们在实现、性能、应用场景等方面存在一些明显的区别和联系。 联系&#xff1a; 分布式计算&#xff1a;三者都是分布式计算的引擎&#xff0c;都可以在大数…

2023-12蓝桥杯STEMA 考试 Python 中高级试卷解析

蓝桥杯STEMA 考试 Python 中高级试卷(12 月) 一、选择题 第一题 以下哪项是取余运算符?( C ) A、* B、// C、% D、+ 第二题 已知:s = "python",执行 print(s[::2])语句后,输出的结果是( B )。 A 、 python B 、pto C 、 nohtyp D 、 yhn …