数据结构 第四章 栈

这篇具有很好参考价值的文章主要介绍了数据结构 第四章 栈。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据结构 第四章 栈,数据结构,数据结构

🚀 写在最前:这篇文章将学习栈这种结构,以及该结构的一些基本操作的实现,包括顺序存储栈和链式存储栈的基本操作的实现。
🚀:点求个关注,让我们一起探索计算机的奥秘!

一、栈的定义

所谓的栈就是一种特殊的线性表,对于栈这种逻辑结构来说他和线性表最大的区别就是栈它删除元素或者添加元素的话只能发生在表的一端,要么就是表尾部,要么就是表头。
数据结构 第四章 栈,数据结构,数据结构

如上图所显示的那样,这就是栈的结构,当然这是将栈这种逻辑结构使用顺序存储的方式表示出来了。

  • 栈顶:这个特殊的线性表允许插入元素和删除元素的一端
  • 栈底:是固定的,不允许进行插入和删除的一端

所以不难发现,由于栈的插入元素和删除元素操作都只能发生在线性表的一端,对于这种结构来说,其元素的进出是遵循后进先出
数据结构 第四章 栈,数据结构,数据结构
对于先进入的元素(元素进入称为进栈),在取出的时候(元素被取出称为出栈),也会是最先被取出的。

二、栈的基本操作

在定义完一个数据的逻辑结构就应该给出相应的基本操作,来操作这个逻辑结构,对于栈这种逻辑结构,是给出了以下几种常用操作。

  • 初始化操作
  • 判断栈是否为空
  • 元素进栈
  • 元素出栈
  • 读栈顶元素,但是不出栈
  • 销毁栈

三、栈不同的存储结构的基本操作实现

在学习线性表时,也是学习了线性表这个逻辑结构在顺序存储下的基本操作的实现以及在链式存储下的基本操作的实现,所以存储结构不同,用代码具体实现这些操作的步骤和思想也是不同的。

①栈的顺序存储

定义好栈的逻辑结构,对于栈这个逻辑结构使用顺序存储,这里使用静态数组来实现顺序存储,定义如下结构。

#define maxsize 100
typedef int Element;

typedef struct {
	Element data[maxsize];    //存放栈元素
	int top;                  //栈顶指针(这里使用静态数组,即使用下标指向栈顶)
}SqStack;

文件结构:

包含三个文件,一个SqStack.h文件用于定义数据结构和数据结构的基本操作,一个SqStack.cpp文件,该文件用于具体实现这些基本操作,一个test.cpp用于测试实现的函数是否正确。
数据结构 第四章 栈,数据结构,数据结构

初始化操作

SqStack.h的内容

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

#define maxsize 100
typedef int Element;

typedef struct {
	Element data[maxsize];    //存放栈元素
	int top;                  //栈顶指针(这里使用静态数组,即使用下标指向栈顶)
}SqStack;


// 初始化操作
bool InitStack(SqStack &SqS);

SqStack.cpp的内容

#include"SqStack.h"

// 初始化操作
bool InitStack(SqStack &SqS) {
	SqS.top = -1;         //将栈顶指向-1,为空
	return true;
}

test.cpp的内容

#include"SqStack.h"

int main() {
	SqStack SqS1;

	//初始化栈
	InitStack(SqS1);
	printf("%d\n", SqS1.top);

	return 0;
}

数据结构 第四章 栈,数据结构,数据结构

栈的判空操作

SqStack.h的内容

//栈的判空操作
bool IsStackEmpty(SqStack SqS);

SqStack.cpp的内容

// 判断栈是否为空
bool IsStackEmpty(SqStack SqS)
{
	if (SqS.top == -1) {
		return true;
	}
	else {
		return false;
	}
}

test.cpp的内容

#include"SqStack.h"

int main() {
	SqStack SqS1;

	//初始化栈
	InitStack(SqS1);
	printf("%d\n", SqS1.top);

	//栈判空
	bool t = IsStackEmpty(SqS1);
	if (t == true) {
		printf("栈为空!\n");
	}

	return 0;
}

数据结构 第四章 栈,数据结构,数据结构

进栈

SqStack.h的内容

// 元素进栈
bool Push(Element e, SqStack &SqS);

//打印栈
void PrintStack(SqStack SqS);

SqStack.cpp的内容 (这里将打印栈的操作也写在其中,没有单独写这个打印操作)

// 元素进栈
bool Push(Element e, SqStack& SqS) {
	if (SqS.top == maxsize-1) {
		printf("栈满,进栈失败\n");
		return false;
	}
	else {
		SqS.top++;
		SqS.data[SqS.top] = e;
		return true;
	}
}


//打印栈
void PrintStack(SqStack SqS) {
	if (SqS.top == -1) {
		printf("栈为空!");
	}
	else {
		printf("打印顺序:栈顶<----栈底\n");
		for (int j = SqS.top; j >= 0; j--) {
			printf("<--%d", SqS.data[j]);
		}
	}
}

test.cpp的内容

#include"SqStack.h"

int main() {
	SqStack SqS1;

	//初始化栈
	InitStack(SqS1);
	printf("%d\n", SqS1.top);

	//栈判空
	bool t = IsStackEmpty(SqS1);
	if (t == true) {
		printf("栈为空!\n");
	}

	//进栈
	Push(2, SqS1);
	Push(3, SqS1);
	PrintStack(SqS1);


	return 0;
}

数据结构 第四章 栈,数据结构,数据结构

出栈

SqStack.h的内容

// 元素出栈
Element Pop(SqStack &SqS);

SqStack.cpp的内容

// 元素出栈
Element Pop(SqStack &SqS) {
	if (SqS.top == -1) {
		printf("栈空导致出栈失败\n");
		exit;
	}
	else {
		Element ele = SqS.data[SqS.top];
		SqS.top--;
		return ele;
	}
}

test.cpp的内容

#include"SqStack.h"

int main() {
	SqStack SqS1;

	//初始化栈
	InitStack(SqS1);
	printf("%d\n", SqS1.top);

	//栈判空
	bool t = IsStackEmpty(SqS1);
	if (t == true) {
		printf("栈为空!\n");
	}

	//进栈
	Push(2, SqS1);
	Push(3, SqS1);
	PrintStack(SqS1);
	Element tmp = Pop(SqS1);
	printf("出栈元素为%d\n", tmp);

	return 0;
}

数据结构 第四章 栈,数据结构,数据结构

读栈顶元素

该操作与pop操作的区别是,这个只是读出栈顶的元素,该元素并不出栈。
SqStack.h的内容

// 读栈顶元素,但是不出栈
Element GetTop(SqStack SqS);

SqStack.cpp的内容

// 读栈顶元素,但是不出栈
Element GetTop(SqStack SqS) {
	if (SqS.top == -1) {
		printf("栈顶无元素\n");
		return -1;
	}
	else {
		Element tmp = SqS.data[SqS.top];
		return tmp;
	}
}

test.cpp的内容

#include"SqStack.h"

int main() {
	SqStack SqS1;

	//初始化栈
	InitStack(SqS1);
	printf("%d\n", SqS1.top);

	//栈判空
	bool t = IsStackEmpty(SqS1);
	if (t == true) {
		printf("栈为空!\n");
	}

	//进栈
	Push(2, SqS1);
	Push(3, SqS1);
	PrintStack(SqS1);
	Element tmp = Pop(SqS1);
	printf("出栈元素为%d\n", tmp);
	printf("栈顶元素为%d\n", GetTop(SqS1));

	return 0;
}

数据结构 第四章 栈,数据结构,数据结构

销毁栈

这里的销毁栈,其实只需要将top的值至为-1就行,因为这个栈空间并不是由malloc函数开辟的,所以不需要free()函数来回收空间,在程序结束之后,会自动的回收空间。

②栈的链式存储

栈的初始化

SqStack.h的内容

#include<stdlib.h>

typedef int	ElementType;

typedef struct LinkStackNode {
	ElementType data;    //节点数据
	struct LinkStackNode *next;
}LinkStackNode,*LinkStack;

//栈的初始化
int InitStack(LinkStack &LinkS);

SqStack.cpp的内容

#include"LinkStack.h"

//栈的初始化
int InitStack(LinkStack &LinkS) {
	LinkS = (LinkStackNode*)malloc(sizeof(LinkStackNode)); //LinkS--->头节点 申请了一个头节点
	// printf("%p", LinkS);
	if (LinkS == NULL) {
		printf("空间申请失败导致初始化失败\n");
		return -1;
	}
	else {
		LinkS->next = NULL;  //头节点的next指向空
		return 1;
	}
}

test.cpp的内容

#include"LinkStack.h"

int main() {
	LinkStack l1;
	if (InitStack(l1)) {
		printf("初始化成功\n");
	}
	return 0;
}

数据结构 第四章 栈,数据结构,数据结构

栈的判空操作

SqStack.h的内容

//栈的判空操作
bool IsStackEmpty(LinkStack Links);

SqStack.cpp的内容

//栈的判空操作
bool IsStackEmpty(LinkStack Links) {
	if (Links->next == NULL) {//头节点的next为空,就其头节点后无元素
		return true;
	}
	else {
		return false;
	}
}

test.cpp的内容

#include"LinkStack.h"

int main() {
	LinkStack l1;
	if (InitStack(l1)) {
		printf("初始化成功\n");
	}
	if (IsStackEmpty(l1)) {
		printf("栈为空\n");
	}

	return 0;
}

数据结构 第四章 栈,数据结构,数据结构

进栈

在这一部分将打印栈的操作也写在这一部分了
SqStack.h的内容

//进栈
bool Push(LinkStack Links, ElementType e);
//打印栈
void PrintStack(LinkStack Links);

SqStack.cpp的内容

//进栈
bool Push(LinkStack Links, ElementType e) {
	LinkStackNode* node = (LinkStackNode*)malloc(sizeof(LinkStackNode));
	if (node == NULL) {
		printf("空间申请失败导致进栈失败\n");
		return false;
	}
	else {
		node->next = Links->next;
		Links->next = node;
		node->data = e;
		return true;
	}
}
//打印栈
void PrintStack(LinkStack Links) {
	if (Links == NULL) {
		printf("无效的栈,无法打印\n");
		return;
	}
	if (Links->next == NULL) {
		printf("栈为空!");
		return;
	}
	else {
		printf("打印顺序:栈顶<----栈底\n");
		LinkStackNode* tmp = NULL;
		for (tmp = Links->next; tmp != NULL; tmp = tmp->next) {
			printf("<--%d", tmp->data);
			
		}
		printf("\n");
	}
}

test.cpp的内容

#include"LinkStack.h"

int main() {
	LinkStack l1;
	if (InitStack(l1)) {
		printf("初始化成功\n");
	}
	if (IsStackEmpty(l1)) {
		printf("栈为空\n");
	}

	Push(l1, 3);
	Push(l1, 4);
	PrintStack(l1);

	return 0;
}

数据结构 第四章 栈,数据结构,数据结构

出栈

SqStack.h的内容

//出栈
ElementType Pop(LinkStack Links);

SqStack.cpp的内容


//出栈
ElementType Pop(LinkStack Links) {
	if (Links->next == NULL) {
		printf("栈为空\n");
		return -1;
	}
	else {
		ElementType datatmp = Links->next->data;
		LinkStackNode* tmp = Links->next;
		Links->next = Links->next->next;
		free(tmp);
		return datatmp;
	}
}

test.cpp的内容

#include"LinkStack.h"

int main() {
	LinkStack l1;
	if (InitStack(l1)) {
		printf("初始化成功\n");
	}
	if (IsStackEmpty(l1)) {
		printf("栈为空\n");
	}

	Push(l1, 3);
	Push(l1, 4);
	PrintStack(l1);
	Push(l1, 7);
	printf("此时pop的元素为%d\n", Pop(l1));
	return 0;
}

数据结构 第四章 栈,数据结构,数据结构

读栈顶元素

SqStack.h的内容

//读栈顶元素
ElementType GetEle(LinkStack Links);

SqStack.cpp的内容

//读栈顶元素
ElementType GetEle(LinkStack Links) {
	if (Links->next == NULL) {
		printf("此时栈顶为空\n");
		return -1;
	}
	else {
		ElementType tmp = Links->next->data;
		return tmp;
	}
}

test.cpp的内容

#include"LinkStack.h"

int main() {
	LinkStack l1;
	if (InitStack(l1)) {
		printf("初始化成功\n");
	}
	if (IsStackEmpty(l1)) {
		printf("栈为空\n");
	}

	Push(l1, 3);
	Push(l1, 4);
	PrintStack(l1);
	Push(l1, 7);
	printf("此时pop的元素为%d\n", Pop(l1));
	printf("此时栈顶的元素为%d\n", GetEle(l1));
	return 0;
}

数据结构 第四章 栈,数据结构,数据结构

销毁栈

SqStack.h的内容

//销毁栈
void DestoryStack(LinkStack &links);

SqStack.cpp的内容

//销毁栈
void DestoryStack(LinkStack &links) {
	LinkStackNode* tmp = links->next;
	while (tmp != NULL){
		LinkStackNode* t = tmp;
		tmp = tmp->next;
		free(t);
	}
	free(links); //free掉头节点
	links = NULL;
}

test.cpp的内容

#include"LinkStack.h"

int main() {
	LinkStack l1 = NULL;
	if (InitStack(l1)) {
		printf("初始化成功\n");
	}
	if (IsStackEmpty(l1)) {
		printf("栈为空\n");
	}

	Push(l1, 3);
	Push(l1, 4);
	PrintStack(l1);
	Push(l1, 7);
	printf("此时pop的元素为%d\n", Pop(l1));
	printf("此时栈顶的元素为%d\n", GetEle(l1));
	DestoryStack(l1);
	PrintStack(l1);
	return 0;
}

数据结构 第四章 栈,数据结构,数据结构文章来源地址https://www.toymoban.com/news/detail-852097.html

到了这里,关于数据结构 第四章 栈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 第四章 matlab的循环结构

    第四章 matlab的循环结构

    循环(loop)是一种 matlab 结构,它允许我们多次执行一系列的语句。循环结构有两种 基本形式:while 循环和 for 循环。两者之间的最大不同在于代码的重复是如何控制的。在 while 循环中,代码的重复的次数是不能确定的,只要满足用户定义的条件,重复就进行下 去。相对地,在

    2024年02月06日
    浏览(15)
  • 形象谈JVM-第四章-JVM内存结构

    形象谈JVM-第四章-JVM内存结构

    给我一个CPU,给我一块内存,我来执行一段代码。 我要如何分配呢? new User(); 这里有一个有一个User类,如果我要new出来User对象,必须先知道它长什么样子,我先搞一块区域出来,把User类的样子给存下来。 可以把 “User类的样子” 比作造房子的 “图纸” 或者 “模板” ;

    2024年02月11日
    浏览(10)
  • 第四章 数据关联分析方法

    第四章 数据关联分析方法

    基本概念和方法 关联规则和算法应用 基本概念和术语 关联规则算法应用: 一个关联规则分析的例子—————超市购物篮分析     不要看 后面数字看不懂      项集:是指项的集合。包含k个项的项集称为k-项集 支持度:若A是一个项集,则A的支持度表示在所有事务T中同时

    2024年02月02日
    浏览(15)
  • 【考研数学】线性代数第四章 —— 线性方程组(1,基本概念 | 基本定理 | 解的结构)

    【考研数学】线性代数第四章 —— 线性方程组(1,基本概念 | 基本定理 | 解的结构)

    继向量的学习后,一鼓作气,把线性方程组也解决了去。O.O 方程组 称为 n n n 元齐次线性方程组。 方程组 称为 n n n 元非齐次线性方程组。 方程组(I)又称为方程组(II)对应的齐次线性方程组或导出方程组。 方程组(I)和方程组(II)分别称为齐次线性方程组和非齐次线

    2024年02月11日
    浏览(15)
  • 第四章——数据库的安全性

    第四章——数据库的安全性

    问题的提出:数据库安全性产生的原因 数据库的一大特点是共享性 数据共享必然带来数据库安全性问题 数据库系统中的数据共享不能是无条件的共享 数据库的安全性是指保护数据库以防止不合法的使用所造成的的数据泄露、更改或破坏 系统安全保护措施是否有效是数据库

    2023年04月08日
    浏览(11)
  • 数据库第四章习题_完整版

    数据库第四章习题_完整版

    1.1 请考虑以下 SQL 查询,该查询旨在查找 2017 年春季讲授的所有课程的标题以及教师的姓名的列表。 请问这个查询有什么问题? 首先 section 中并没有我们需要使用到的属性,所以这里 “natural join setion” 是多余的。 其次,更重要的一点是:在 instructor 关系和 course 关系中都有

    2024年02月07日
    浏览(24)
  • 《计算机网络》第四章 数据链路控制

    《计算机网络》第四章 数据链路控制

    为什么要设计数据链路层 在原始的物理传输线路上传输数据信号是有差错的, 存在一定的误码率 。 在设计数据链路层的目的就是如何在有差错的线路上, 进行无差错传输 。向网络层提供高质量的服务。 从网络参考来看,物理层之上各层都有改善 数据传输质量 的要求,数

    2024年02月01日
    浏览(9)
  • 【计算机网络 - 第四章】网络层:数据平面

    【计算机网络 - 第四章】网络层:数据平面

    目录 一、网络层概述 1、主要作用 2、控制平面方法 3、网络层提供的两种服务 二、路由器工作原理 1、路由器总体结构 2、输入、输出端口处理 (1)输入端口 (2)输出端口 3、交换 (1)经内存交换 (2)经总线交换 (3)经互联网络交换  4、排队问题 (1)输入排队、输出

    2024年02月06日
    浏览(16)
  • 计算机网络|第四章:网络层:数据平面

    计算机网络|第四章:网络层:数据平面

    前文回顾 :第三章:传输层 运输层依赖于网络层的主机到主机的通信服务,提供各种形式的进程到进程的通信。 网络层与传输层和应用层不同的是, 在网络中的每一台主机和路由器中都有一个网络层部分 。正因如此,网络层协议是协议栈中最具挑战性的部分。 网络层分为

    2024年02月12日
    浏览(8)
  • 第四章 Linux网络编程 4.1 网络结构模式 4.2MAC地址、IP地址、端口

    第四章 Linux网络编程 4.1 网络结构模式 4.2MAC地址、IP地址、端口

    C/S结构 简介 服务器 - 客户机 ,即 Client - Server(C/S)结构。C/S 结构通常采取两层结构。服务器负责数据的管理,客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器,服务器则是提供信息供人访问的计算机。 客户机通过局域网与服务器相连,接受用户

    2024年02月08日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包