数据结构与算法基础(王卓)(11):栈的定义及其基础操作(顺序表和链表的初始化、求长度,是否为空,清空和销毁、出栈、压栈)

news/2024/4/16 18:04:11/文章来源:https://blog.csdn.net/Zz_zzzzzzz__/article/details/128790962

 栈的定义:

stack:一堆,一摞;堆;垛;


顺序栈和链栈的设计参考:

数据结构与算法基础(王卓)(7):小结:关于链表和线性表的定义及操作_宇 -Yu的博客-CSDN博客


顺序栈:


前置条件:

(这里写的是线性表的构造形式,也可以写成链表的构造形式)

//基于线性表的定义所做的更改
#include<iostream>
using namespace std;
#include<stdlib.h>//存放exit
#include<math.h>//OVERFLOW,exit#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE  -1
//#define OVERFLOW   -2   #define MAXlength 100  
//可按需修改,PPT中写的是MAXlengthstruct Poly
{float p;int e;bool operator==(Poly t){return t.p == p && t.e == e;}bool operator!=(Poly t){return t.p != p || t.e != e;}
};struct Sqlist
{Poly* elem;int length;
};typedef int Status; 
typedef Poly Elemtype;
typedef Elemtype SElemType;
//注意:这一段必须写在调用SElemType类型及其指针之前struct SqStack
{SElemType* base; //栈底指针  SElemType* top;//栈顶指针int stacksize; //栈可用最大容量
};

初始化:

Status InitStack(SqStack& S)//构造一个空栈
{S.base = new SElemType[MAXlength];//或//S.base = (SElemType*)malloc(MAXlength * sizeof(SElemType));if (!S.base) exit(OVERFLOW);// 存储分配失败S.top = S.base;//栈顶指针等于栈底指针S.stacksize = MAXlength;return true;
}

简单操作:(求长度,是否为空,清空和销毁)

Status StackEmpty(SqStack S)
{// 若栈为空,返回TRUE;否则返回FALSE if (S.top == S.base)return TRUE;elsereturn FALSE;
}int StackLength(SqStack S)
{return S.top - S.base;
}Status ClearStack(SqStack S)//清空顺序栈
{if (S.base)S.top = S.base;return OK;
}Status DestroyStack(SqStack& S)//销毁
{if (S.base){delete S.base;S.stacksize = 0;S.base = S.top = NULL;}return OK;
}

在这里,我们很容易产生这样的疑问:

关于清空和销毁,我们不是应该把元素一个一个置为NULL吗???

这里销毁和清空改变的只是指向这个位置的指针的值,可是没有把位置的内容置空(null)啊??

实际原因解释如下:

清空:


这里我们其实只是让(将)栈回归到(置于)空栈的状态(两指针指向同一栈点)

至于栈的内容,清不清除其实都无所谓:

因为只要我们后面在写入元素,前面放在栈中没有被消除的元素自然都会被覆盖


销毁:


直接销毁base指针,这里我们或许会觉得:

你只不过是销毁base指针而已,你凭啥就说这样操作我们能实现销毁整个栈的内容和内存?

而事实上他确实办到了,至于原因,我们可以去看看该表的初始化操作:

在给该表初始化时,我们采用的操作是给base指针开辟内存空间:

    S.base = new SElemType[MAXlength];

所以只要我们把base指针销毁就可以实现销毁整个栈的内容和内存的操作:

delete操作销毁了base指针内部的内容同时也销毁了以base指针作为头指针的整个栈的内存空间


压栈:

程序设计流程:


程序:

Status Push(SqStack& S, SElemType e)
{if (S.top-S.base==S.stacksize)//不是MAXlengthreturn OVERFLOW;*S.top = e;S.top++;//也可以写成://*S.top++ = e;return true;
}

ISSUES:


(1):

注意,这里栈满的语句写的是:

    if (S.top-S.base==S.stacksize)

其中的 S.stacksize 不能写 MAXlength


(2):

关于 *S.top++ = e;    的优先级问题:

自增(算术运算符)的优先级大于赋值运算符

所以理论上说,这里应该是先自增,后运算

但是(然而),这里我们写的语句用的是:*S.top++

也就是说:在等到该语句中,所有其他操作都执行完成以后,再执行自增操作

所以才等价于先赋值,再自增


出栈:

程序设计流程:


程序:

Status Pop(SqStack& S, SElemType& e)
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;	否则返回ERROR
{if (S.top == S.base) // 等价于 if(StackEmpty(S))return UNDERFLOW;//ERROR;e = *S.top;S.top--;//e = *--S.top;return true;
}

同样的,这里先赋值,后自减;

这里不再赘述


链栈:

前置条件:

//基于链表的定义所做的更改
#include<iostream>
using namespace std;
#include<stdlib.h>//存放exit#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE  -1
//#define OVERFLOW   -2   #define MAXlength 100  //初始大小为100,可按需修改struct K//Poly
{float a;int b;string c;bool operator==(K& t){return t.a == a && t.b == b;//&& t.c = c;}bool operator!=(K& t){return t.a != a || t.b != b;//|| t.c = c;}
};
typedef K Elemtype;         //函数调用状态struct Lnode//node:结; 结点;
{Elemtype data;Lnode* next;
};
typedef Lnode* LinkList;typedef int Status; 
typedef K Elemtype;
typedef Elemtype SElemType;
//注意:这一段必须写在调用SElemType类型及其指针之前struct StackNode
{SElemType data;StackNode* next;
};
typedef StackNode *LinkStack;
LinkStack S;

其中:(模块构造解析) 

SElemType:Poly(复合)型

top,base:SElemType型指针

 另外,在这里我们需要注意,定义结构体时可以实现嵌套自身,本质上就像:

#include<iostream>
using namespace std;struct S
{int data;S* next;
};int main()
{}

简单操作:(初始化、是否为空、取栈顶元素)

int InitStack(LinkStack& S) 
{//构造一个空栈,栈顶指针置为空S = NULL;return OK;
}Status StackEmpty(LinkStack S)
{if (S == NULL)return TRUE;else return FALSE;
}SElemType GetTop(LinkStack S)
{if (S != NULL)return S->data;
}


入栈:

Status Push(LinkStack& S, SElemType e)
{StackNode* p = new StackNode;p->data = e;p->next = S;S = p;return true;
}

出栈:


我写的:

Status Pop(LinkStack& S, SElemType e)
{LinkStack p = S;e = p->data;S = p->next;delete p;return true;
}

参考PPT,我们可以发现,做出如下改动会更好更严谨:

加上语句:
    if (S == NULL) return ERROR;

 

返回的e为引用类型

最终版:

Status Pop(LinkStack& S, SElemType &e)
{if (S == NULL) return ERROR;LinkStack p = S;e = p->data;S = p->next;delete p;return true;
}

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

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

相关文章

备考软考系统分析师-1

系统分析师教程网盘资源&#xff1a;链接: https://pan.baidu.com/s/1ekHuCJJ3o5RrW1xeMkxhdA 提取码: 6666 信息系统战略规划 信息系统开发方法&#xff1a; 结构化法 瀑布模型 原型法 自顶向下 用于需求阶段较多 面向对象 自底向上 面向服务的方法 系统建模 政府信息…

MyBatis-Plus——代码生成器(3.5.1+版本)

文章目录配置数据源配置&#xff08;DataSource&#xff09;全局配置&#xff08;GlobalConfig&#xff09;包配置&#xff08;PackageConfig&#xff09;策略配置&#xff08;StrategyConfig&#xff09;模板引擎配置&#xff08;TemplateEngine&#xff09;代码生成器测试样例…

【2】MYSQL数据的导入与导出

文章目录 MYSQL-库(相同库名称)的导入导出MYSQL-库(不同库名称)的导入导出MYSQL-表的导入导出MYSQL-表的指定查询记录导入导出前提: 客户端工具是:SQLyog MYSQL-库(相同库名称)的导入导出 1、选中指定库——右键,选择【将数据库复制到不同的主机/数据库】 2、选中指…

客户服务知识库的最佳实践7个步骤

每个公司的声誉都依赖于客户&#xff0c;如果客户因为想要购买你的产品找到你&#xff0c;但是了解到你的客户服务做的不好&#xff0c;可能也会放弃你的产品&#xff0c;就像市场营销依赖于潜在客户的关系一样&#xff0c;公司的服务部门也需要依赖于现有客户的关系&#xff0…

arxiv2017 | 用于分子神经网络建模的数据增强 SMILES Enumeration

论文标题&#xff1a;SMILES Enumeration as Data Augmentation for Neural Network Modeling of Molecules论文地址&#xff1a;https://arxiv.org/abs/1703.07076代码地址&#xff1a;https://github.com/Ebjerrum/SMILES-enumeration一、摘要摘要中明显提出&#xff1a;先指…

AI又进化了,突破性革命来了

大家好&#xff0c;我是 Jack。 2023 年&#xff0c;AI 真的杀疯了。短短不到一年的时间&#xff0c;当我们还在感慨 AI 一键生成的二次元画作精美万分的时候&#xff0c;它已经进化到了写实美照也能手到擒来的地步。 更多的效果&#xff0c;可以看刚刚发布的视频&#xff0c;…

总是跳转到国内版(cn.bing.com)?New Bing使用全攻略

你是否想要使用强大的&#xff08;被削后大嘘&#xff09;New Bing&#xff1f; 你是否已经获得了New Bing的使用资格&#xff1f; 你是否在访问www.bing.com/new时提示页面不存在&#xff1f; 你是否在访问www.bing.com时总是重定向到cn.bing.com而使用不了New Bing? New Bi…

RocketMQ之(一)RocketMQ入门

一、RocketMQ入门一、RocketMQ 介绍1.1 RocketMQ 是什么&#xff1f;1.2 RocketMQ 应用场景01、应用解耦02、流量削峰03、数据分发1.3 RocketMQ 核心组成01、NameServer02、Broker03、Producer04、Consumer1.6 运转流程1.5 RocketMQ 架构01、NameServer 集群02、Broker 集群03、…

Linux docker(03)可使用GPU渲染的x11docker实战总结

该系列文章的目的旨在之前的章节基础上&#xff0c;使用x11docker构建一个可以使用GPU的docker容器。该容器可以用于3D图形渲染/XR 等使用GPU渲染的程序调试和运行。 0 why docker 为什么非要用x11docker&#xff0c;而不是其他的docker呢&#xff1f; 因为一般的docker是不…

第2讲-数据库系统的结构抽象与演变(测试题总结)

一、测试题 DBS的三级模式&#xff1a;外模式&#xff08;也叫用户模式或子模式&#xff09;&#xff0c;模式&#xff08;也叫逻辑模式&#xff09;&#xff0c;内模式&#xff08;也叫存储模式&#xff09; 外模式/模式映像 实现了数据的逻辑独立性 模式/内模式映像 实现了…

C++ 入门篇(八) auto关键字

目录 一、auto简介 二、auto的使用场景 三、注意事项 四、源代码 一、auto简介 在早期C/C中auto的含义是&#xff1a;使用auto修饰的变量&#xff0c;是具有自动存储器的局部变量&#xff0c;C11中&#xff0c;标准委员会赋予了auto全新的含义即&#xff1a;auto不再是一个存…

c++ 那些事 笔记

GitHub - Light-City/CPlusPlusThings: C那些事 1. ① extern extern关键字&#xff0c;C语言extern关键字用法详解 如果全局变量不在文件的开头定义&#xff0c;其有效的作用范围只限于其定义处到文件结束。如果在定义点之前的函数想引用该全局变量&#xff0c;则应该在…

前缀和差分(C/C++)

目录 1. 前缀和的定义 2. 一维前缀和 2.1 计算公式 2.2 用途 2.3 小试牛刀 3. 二维前缀和 3.1 用途 1. 前缀和的定义 对于一个给定的数列A&#xff0c;他的前缀和数中 S 中 S[ i ] 表示从第一个元素到第 i 个元素的总和。 如下图&#xff1a;绿色区域的和就是前缀和数组…

清洁级动物(CL)实验室设计SICOLAB

清洁级动物&#xff08;CL&#xff09;实验室设计清洁级动物&#xff08;CL&#xff09;实验室设计有哪些内容&#xff1f;工艺流程是如何&#xff1f;功能房间的划分清洁级动物实验室&#xff08;CL实验室&#xff09;是进行高洁净度动物实验的专门场所&#xff0c;需要满足一…

Shopee、ebay、亚马逊等跨境卖家了解测评的一篇干货

随着时代的发展&#xff0c;大家越来越喜欢网购&#xff0c;国外也有亚马逊、沃尔码、阿里国际、速卖通、ebay、shopee、Lazada、ozon、temu等等&#xff0c;而国外这些平台也有很大的市场&#xff0c;跨境电商也随时诞生&#xff0c;而当今社会环境实体生意越来越难做&#xf…

Kubernetes二 Kubernetes之实战以及pod详解

Kubernetes入门 一 Kubernetes实战 本章节将介绍如何在kubernetes集群中部署一个nginx服务&#xff0c;并且能够对其进行访问。 1.1 Namespace Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。…

【java】Spring Cloud --Spring Cloud 的核心组件

文章目录前言一、Eureka&#xff08;注册中心&#xff09;二、Zuul&#xff08;服务网关&#xff09;三、 Ribbon&#xff08;负载均衡&#xff09;四、Hystrix&#xff08;熔断保护器&#xff09;五、 Feign&#xff08;REST转换器&#xff09;六、 Config&#xff08;分布式配…

飞塔Fortinet防火墙SSL VPN双因素身份认证(2FA)方案

作为行业领先的防火墙厂商&#xff0c;飞塔Fortinet结合了高性能 VPN 功能&#xff0c;代表了网络安全的新概念。其中飞塔Fortinet防火墙 SSL VPN 因其突出的安全性能而被广泛应用在远程办公场景中。但在 SSL VPN 登录时用户仅需输入用户名和固定的静态密码&#xff0c;若遭遇账…

kettle安装部署_简单认识_Spoon勺子界面---大数据之kettle工作笔记002

然后我们来看一下这个kettle的安装,很简单,下载解压就可以了 上面的地址是官网很烂 下面的地址好一些 这个是官网可以看到很慢,很不友好 这个是下面那个地址,可以看到 最新的是9.0了,一般都用 一般都用8.2 这里下载这个就可以了 下载以后可以看到有个pdi

LeetCode 每日一题2347. 最好的扑克手牌

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…