数据结构-----栈(栈的初始化、建立、入栈、出栈、遍历、清空等操作)

2023-09-15 16:12:51

目录

前言

1.定义

2.栈的特点

3.栈的储存方式

3.1数组栈

3.2链栈

 4.栈的基本操作(C语言)

4.1初始化 

 4.2判断是否满栈

4.3判断空栈

 4.4 入栈

4.5 出栈

4.6获取栈顶元素

 4.7遍历栈

 4.8清空栈

 完整代码示例


前言

        大家好呀!今天我们开始学习新的线性表结构----栈,前面我们学习了链表以及链表的相关操作,那么栈跟链表有什么区别呢,操作如何呢?下面就一起来看看吧!

1.定义

        栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

2.栈的特点

        栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针

        栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为出栈/退栈(POP)。栈也称为先进后出表。

 

3.栈的储存方式

栈的存储方式有两种:数组栈链栈,即栈的数组存储和链式存储。

 数组栈:数组栈是通过数组的形式去存放数据的,然后定义一个栈顶top指针指向当前栈顶的位置,这个位置也就是数组最后一个位置

链表栈:链表栈就是去通过链表节点的形式去储存数据,然后建立链式结构,对这个链表进行栈的相关操作,以达到栈的特点。二者的节点写法分别如下所示:

3.1数组栈
//01 数组栈
typedef struct sqstack {
	ElemType date[Maxsize];//数据
	int top;//数组栈的栈顶指针
}SqStack;
3.2链栈
//02链表栈
typedef struct linknode {
	ElemType date[Maxsize];//数据
	struct linknode* next;//指向下一个节点的指针
}* LiStack;

(本文主要讲解数组栈) 

 4.栈的基本操作(C语言)

 栈的操作方法有以下方法:

#include<stdio.h>
#include<string.h>
#define Maxsize 10//最大空间容量

//数据类型
typedef struct datatype {
	int age;
	char name[10];
}ElemType;

//数组栈
typedef struct sqstack {
	ElemType date[Maxsize];//数据
	int top;//数组栈的栈顶指针
}Stack;

initStack(Stack *L);//初始化栈

isFull(Stack *L);//判断是否满栈

isEmpty(Stack *L);//判断是否空栈

push(Stack *L,ElemType date);//入栈

pop(Stack *L);//出栈

top_date(Stack* L);//获取栈顶元素

show_stack(Stack *L);//遍历栈

clear_stack(Stack *L);//清空栈元素

【注:以上均是数组栈的操作方法】

4.1初始化 

让栈顶元素初始化为-1,即 L->top=-1;

//初始化
void initStack(Stack *L) {
	L->top = -1;
}
 4.2判断是否满栈

判断满栈的方法就是看栈顶元素位置是否达到最大容量

//判断是否满了
int isfull(Stack *L) {
	if (L->top == Maxsize - 1) {//此时栈已满
		printf("The stack is full\n");
		return 1;
	}
	return 0;
}
4.3判断空栈

同样的判断是否空栈,只需要看栈顶top的位置是否为初始化的时候,即L->top==-1

//判断是否为空栈
int isEmpty(Stack *L) {
	if (L->top == -1) {
		printf("The stack is empty\n");
		return 1;
	}
	return 0;
}
 4.4 入栈

进行入栈操作的时候,每次放入一个数据后,栈顶指针依次向上移动一位即可,如图所示:

//入栈
void push(Stack *L,ElemType date){
	if (isfull(L)) {  //判断栈是否满了
		printf("failed to push\n");
		return;
	}
	else {
		L->date[L->top].age = date.age;
		strcpy(L->date[L->top].name, date.name);
        L->top+=1;
	}
}
4.5 出栈

进行出栈操作时,取出栈顶元素后,栈顶指针依次向下移动一位,如下所示:

//出栈
ElemType pop(Stack *L) {
	ElemType pop_date = { 0 };
	//先判断是不是空栈
	if (isEmpty(L)) {
		return pop_date;
	}
	pop_date = L->date[L->top];
	L->top--;
	return pop_date;
}
4.6获取栈顶元素

获取栈顶元素就不进行出栈操作,直接返回栈顶元素即可。

//获取栈顶元素(不出栈)
ElemType get_topdate(Stack* L) {
	return L->date[L->top];
}
 4.7遍历栈

遍历栈,即当栈不为空的时候,从栈顶开始往下依次输出数据即可。

//遍历栈,输出数据
void show_stack(Stack *L) {
	if (!isEmpty(L)) {
		for (int i = L->top; i >= 0; i--) {
			printf("%d %s\n", L->date[i].age, L->date[i].name);
		}
	}
}
 4.8清空栈

清空栈,只需要让栈顶指针回归到初始化即可,L->top=-1;

//清空栈
void clear_stack(Stack *L) {
	L->top = -1;//直接让栈顶回归就行了
	//之前的那些数据不会被删除,但是引索找不到了,下次入栈就会把这些数据给覆盖掉
}

 完整代码示例

#include<stdio.h>
#include<string.h>
#define Maxsize 10//设置最大空间容量

typedef struct datatype {
	int age;
	char name[10];
}ElemType;
// 数组栈
typedef struct sqstack {
	ElemType date[Maxsize];//数据
	int top;//数组栈的栈顶指针
}Stack;

//初始化
void initStack(Stack *L) {
	L->top = -1;
}

//判断是否满了
int isfull(Stack *L) {
	if (L->top == Maxsize - 1) {//此时栈已满
		printf("The stack is full\,");
		return 1;
	}
	return 0;
}

//入栈
void push(Stack *L,ElemType date){
	if (isfull(L)) {
		printf("failed to push\n");
		return;
	}
	else {
		L->top+=1;
		L->date[L->top].age = date.age;
		strcpy(L->date[L->top].name, date.name);
	}
}

//判断是否为空栈
int isEmpty(Stack *L) {
	if (L->top == -1) {
		printf("The stack is empty\n");
		return 1;
	}
	return 0;
}

//出栈
ElemType pop(Stack *L) {
	ElemType pop_date = { 0 };
	//先判断是不是空栈
	if (isEmpty(L)) {
		return pop_date;
	}
	pop_date = L->date[L->top];
	L->top--;
	return pop_date;
}

//获取栈顶元素(不出栈)
ElemType get_topdate(Stack* L) {
	return L->date[L->top];
}

//清空栈
void clear_stack(Stack *L) {
	L->top = -1;//直接让栈顶回归就行了
	//之前的那些数据不会被删除,但是引索找不到了,下次入栈就会把这些数据给覆盖掉
}

//遍历栈,输出数据
void show_stack(Stack *L) {
	if (!isEmpty(L)) {
		for (int i = L->top; i >= 0; i--) {
			printf("%d %s\n", L->date[i].age, L->date[i].name);
		}
	}
}

int main() {
	Stack stack ;
	ElemType date[4] = { {15,"Jack"},{16,"Amy"} ,{15,"John"},{17,"Tom"}};
	initStack(&stack);
	for(int i=0;i<4;i++)
		push(&stack, date[i]);//依次入栈
	show_stack(&stack);	//遍历栈
	ElemType pop_date= pop(&stack);//出栈
	printf("出栈元素为:%d %s\n", pop_date.age, pop_date.name);
	ElemType top_date = get_topdate(&stack);//获取栈顶元素
	printf("栈顶元素为:%d %s\n", top_date.age, top_date.name);
	clear_stack(&stack);//清空栈
}
//测试结果
/*17 Tom
15 John
16 Amy
15 Jack
出栈元素为:17 Tom
栈顶元素为:15 John*/

好啦,以上就是本期的全部内容了,我们下一期再见!see you!

分享一张壁纸: 

更多推荐

卷积神经网络(一)

文章目录前言卷积层多通道池化层代码前言从外行者角度看卷积神经网络会说无非就是卷积层后面跟着一个池化层,但是深入代码实际编写卷积神经网络总是有些困难的。其中包括各种细节比如数据格式、尺寸变化、运算规定等。参考:{{Citejournal|last1=Zhang|first1=Aston|last2=Lipton|firs

tcp_v4_connect函数的解析

源码:inttcp_v4_connect(structsock*sk,structsockaddr*uaddr,intaddr_len){//解析输入的地址结构structsockaddr_in*usin=(structsockaddr_in*)uaddr;//获取TCP协议栈的全局death_row对象structi

STM32H5开发(5)----串口打印配置

STM32H5开发----4.开发板介绍概述样品申请硬件准备生成例程配置调试口代码生成配置项目配置调试配置串口重定向打印测试结果概述在使用STM32CUBEIDE开发STM32H5项目时,串口打印被证明是一项极其有益的调试工具,能够在开发过程中实时输出信息和调试数据,起到了至关重要的作用。通过充分利用串口打印功能,开发

Netty面试题(一)

文章目录前言一、BIO、NIO和AIO的区别?二、NIO的组成?三、Netty的特点?总结前言BIO、NIO和AIO的区别?NIO的组成?Netty的特点?一、BIO、NIO和AIO的区别?BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。伪异步IO:将请求连接放入线程池,一对

从零学算法(剑指 Offer 33)

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树:5/\26/\13示例1:输入:[1,6,3,2,5]输出:false示例2:输入:[1,3,2,6,5]输出:true我的思路:二叉搜索树就是左节点都

DS相关题目

DS相关题目题目一:消失的数字拿到这道题目之后,首先可以想到的一个解题方法就是,我们可以先排序,排完序之后,这个数组其实就是一个有序的数组了,那只用比较数组中的每一个元素和他对应的下标是不是相等的,如果是相等的,那么就说明对应的数字其实是存在的,如果是不相等的,那么就说明对应的数字其实就是不存在的了,但是如果要排序的话

GIS前端-地图操作与交互

GIS地图操作与交互地图操作与交互基本原理Leaflet提供的事件缩放控件常用的基础功能通常是一个应用系统所必需的,如地图的缩放、导航、定位、弹出框等,它让一张静态的地图动起来,让地图承载更多的空间信息,并以友好的交互方式呈现给用户。例如,一个大众应用的旅游GIS系统,如果仅仅在Web端显示一张地图,那么这时只能看到一

用户案例|Shopee 在多媒体理解业务的向量检索系统实践

Shopee是一家全球性的电商平台,业务范围辐射东南亚、拉美等多个地区。多媒体理解(MultimediaUnderstanding,下文简称MMU)团队是Shopee内专注于提供多媒体内容理解服务的团队,为电商、直播、短视频等业务提供支持。MMU团队需要支持公司不同业务场景对多媒体理解的需求。以向量检索为例,可能会有如

React 简介

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录ComponentJSXMultiplecomponentsprops:passingdatatocomponentsSomenotes我们现在将开始入门的可能是本课程最重要的主题,即React-库。让我们从制

ArmSom-W3开发板之PCIE的开发指南(一)

1.简介RK3588从入门到精通本⽂介绍RK平台配置pcie的方法开发板:ArmSoM-W32、PCIE接口概述PCIe(PeripheralComponentInterconnectExpress)是一种用于连接计算机内部组件的高速接口标准。以下是关于PCIe接口的简要介绍:高速传输:PCIe接口提供了高速的数据传输

0018Java程序设计-springboot智慧环卫养管作业平台

文章目录摘要目录系统设计开发环境摘要本智慧环卫养管作业平台就是建立在充分利用现在完善科技技术这个理念基础之上,并使用IT技术进行对环卫养管作业的管理,从而保证环卫养管作业能够高效的进行,可以实现环卫养管作业的在线管理,这样保证了资源共享效率的最优化,通过系统的管理,使系统的使用率达到最大化。论文采用图文论述方法,通过与

热文推荐