数据结构与算法学习笔记七---链栈的表示和实现(C++)

目录

1.链栈的概念

2.链栈的链式存储实现

1.初始化

2.销毁        

3.清空栈

4.判断栈空

5.栈长        

6.获取栈顶元素        

7.入栈

8.出栈

9.遍历

10.完整代码


1.链栈的概念

    链栈是指采用链式存储结构实现的栈。通常使用单链表来表示。链栈的示意图如下:

        图1.链栈示意图

2.链栈的链式存储实现

        链栈的定义如下:

#define ElementType int
typedef int Status;
typedef struct StackNode {ElementType data;struct StackNode *next;
} StackNode, *LinkStack;

1.初始化

        链栈的初始化只需要将指针置为空来表示链栈为空。

// 初始化链栈
Status initLinkStack(LinkStack &linkStack) {linkStack = nullptr; // 将链栈指针初始化为 nullptrreturn 1;
}

2.销毁        

        这个方法会释放链栈中所有节点的内存,将链栈的头指针置空,以表示链栈已经被销毁。

// 销毁链栈
void destroyLinkStack(LinkStack &linkStack) {LinkStack p = linkStack;while (p) {LinkStack temp = p;p = p->next;delete temp;}linkStack = nullptr; // 将链栈指针设置为 nullptr
}

3.清空栈

         释放链栈中每个节点的内存,使链栈变为空栈。

// 清空链栈
void clearLinkStack(LinkStack &linkStack) {while (linkStack != nullptr) {LinkStack temp = linkStack; // 暂存当前节点linkStack = linkStack->next; // 移动到下一个节点delete temp; // 释放当前节点的内存}
}

4.判断栈空

        这个方法会检查链栈是否为空,如果链栈头指针为空,则说明链栈为空,返回 true,否则返回 false。        

// 判断链栈是否为空
Status linkStackEmpty(LinkStack linkStack) {return linkStack == nullptr;
}

5.栈长        

        遍历链栈,统计链栈中节点的个数,并返回该值。

// 获取链栈的长度
int getLinkStackLength(LinkStack linkStack) {int length = 0;StackNode *current = linkStack;while (current != nullptr) {length++;current = current->next;}return length;
}

6.获取栈顶元素        

        获取链栈的栈顶元素,并通过指针参数 element 返回栈顶元素的值。

// 获取链栈的栈顶元素
Status getLinkStackTop(LinkStack linkStack, ElementType &element) {if (linkStack == nullptr || linkStack->next == nullptr) {return 0;}element = linkStack->next->data;return 1;
}

7.入栈

        该方法用于将元素压入链栈,将新元素插入到链栈的顶部。

        图2.入栈过程

// 入链栈
Status pushLinkStack(LinkStack &linkStack, ElementType element) {StackNode *newNode = new StackNode;if (!newNode) {return 0;}newNode->data = element;newNode->next = linkStack;linkStack = newNode;return 1;
}

8.出栈

        该方法用于从链栈中弹出栈顶元素。

        链栈出栈过程如下图所示:

        图3.出栈过程

// 出链栈
Status popLinkStack(LinkStack &linkStack, ElementType &element) {if (linkStack == nullptr) {return 0;}StackNode *temp = linkStack;element = temp->data;linkStack = temp->next;delete temp;return 1;
}

9.遍历

        遍历链栈。

// 遍历链栈
void traverseLinkStack(LinkStack linkStack) {StackNode *p = linkStack;while (p != nullptr) {cout << p->data << "\t";p = p->next;}cout << endl;
}

10.完整代码

#include <iostream>
using namespace std;#define ElementType int
typedef int Status;typedef struct StackNode {ElementType data;struct StackNode *next;
} StackNode, *LinkStack;// 初始化链栈
Status initLinkStack(LinkStack &linkStack) {linkStack = nullptr; // 将链栈指针初始化为 nullptrreturn 1;
}// 销毁链栈
void destroyLinkStack(LinkStack &linkStack) {LinkStack p = linkStack;while (p) {LinkStack temp = p;p = p->next;delete temp;}linkStack = nullptr; // 将链栈指针设置为 nullptr
}// 判断链栈是否为空
bool linkStackEmpty(LinkStack linkStack) {return linkStack == nullptr;
}// 获取链栈的长度
int getLinkStackLength(LinkStack linkStack) {int length = 0;StackNode *current = linkStack;while (current != nullptr) {length++;current = current->next;}return length;
}// 获取链栈的栈顶元素
Status getLinkStackTop(LinkStack linkStack, ElementType &element) {if (linkStack == nullptr || linkStack->next == nullptr) {return 0;}element = linkStack->next->data;return 1;
}// 入链栈
Status pushLinkStack(LinkStack &linkStack, ElementType element) {StackNode *newNode = new StackNode;if (!newNode) {return 0;}newNode->data = element;newNode->next = linkStack;linkStack = newNode;return 1;
}// 出链栈
Status popLinkStack(LinkStack &linkStack, ElementType &element) {if (linkStack == nullptr) {return 0;}StackNode *temp = linkStack;element = temp->data;linkStack = temp->next;delete temp;return 1;
}// 遍历链栈
void traverseLinkStack(LinkStack linkStack) {StackNode *p = linkStack;while (p != nullptr) {cout << p->data << "\t";p = p->next;}cout << endl;
}int main() {LinkStack linkStack = nullptr; // 初始化链栈指针为 nullptrcout << "链栈初始化......" << endl;if (initLinkStack(linkStack)) {cout << "链栈初始化成功" << endl;} else {cout << "链栈初始化失败" << endl;}// 示例入栈操作pushLinkStack(linkStack, 1);pushLinkStack(linkStack, 2);pushLinkStack(linkStack, 3);// 遍历并输出栈中元素cout << "链栈中的元素为:";traverseLinkStack(linkStack);// 输出链栈长度cout << "链栈的长度为:" << getLinkStackLength(linkStack) << endl;// 输出栈顶元素ElementType topElement;if (getLinkStackTop(linkStack, topElement)) {cout << "链栈的栈顶元素为:" << topElement << endl;}// 出栈并输出结果cout << "出栈操作:" << endl;ElementType poppedElement;while (popLinkStack(linkStack, poppedElement)) {cout << "出栈元素:" << poppedElement << endl;}// 测试销毁链栈destroyLinkStack(linkStack);if (linkStackEmpty(linkStack)) {cout << "链栈已销毁" << endl;}return 0;
}

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

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

相关文章

ACL访问控制列表

ACL概述 为什么会有ACL 因为我们要过滤数据流量&#xff0c;要做访问控制&#xff0c;要保障内网安全 ACL是什么 ACL&#xff1a;访问控制列表是一个包含了多个规则的列表&#xff0c;不同规则通过规则号进行区分每个规则都包含动作条件两部分内容动作分为&#xff1a;允许…

【C#】学习获取程序执行路径,Gemini 帮助分析

一、前言&#xff1a; 在Delphi中&#xff0c;如果想要获取当前执行程序的目录&#xff0c;程序代码如下&#xff1a; ExtractFilePath(ParamStr(0)); 今天在分析一个别人做的C#程序时看到了一段C#代码&#xff0c;意思是获取执行程序所在的文件目录&#xff1a; public stat…

使用 scrapyd 部署 scrapy

1.scrapyd 是什么&#xff1f; Scrapyd 是一个用于部署和运行 Scrapy 爬虫项目的服务器应用程序。它使得你可以通过 HTTP 命令来部署、管理和执行多个 Scrapy 爬虫&#xff0c;非常适合持续集成和生产环境中的爬虫部署。 2.安装scrapyd 并使用 2.1 安装 scrapyd F:\scrapydTes…

智能革新:如何用会话式AI提升您的工作效率?

提升职场竞争力&#xff0c;会话式AI产品助你走在时代前沿 在当今的职场环境中&#xff0c;提高工作效率是每一位人力资源管理者追求的目标。而在效率的背后&#xff0c;往往隐藏着工作方法的正确与否。在众多提升效率的方法中&#xff0c;人工智能技术无疑是一股不可忽视的力量…

汇聚荣科技:拼多多开店没有流量应该怎么办?

拼多多开店没有流量是一个常见的问题&#xff0c;许多新手商家都会遇到这样的困境。那么&#xff0c;如何解决这个问题呢?下面从四个方面进行详细阐述。 一、优化店铺和商品 首先&#xff0c;要确保店铺和商品的质量。店铺要有自己独特的风格和特色&#xff0c;商品要有高质量…

Java | Leetcode Java题解之第90题子集II

题目&#xff1a; 题解&#xff1a; class Solution {List<Integer> t new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();public List<List<Integer>> subsetsWithDup(int[] nums) {Arra…

RK3568平台开发系列讲解(SPI篇)spi_dev 驱动分析

🚀返回专栏总目录 文章目录 一、结构体二、API三、spidev驱动分析3.1、init3.2、probe3.3、spidev_write3.4、spidev_read3.5、spidev_open四、spi_register_driver分析五、spi_dev缺点沉淀、分享、成长

docker 部署 prometheus + Grafana +

# prometheus安装 # 1.拉镜像 docker pull prom/prometheus:v2.43.0 # 2.创建配置文件 mkdir /opt/prometheus/data cd /opt/prometheus/ vi prometheus.yml # 3.使用root用户启动 docker run --name prometheus -d -p 9090:9090 -v /opt/prometheus/prometheus.yml:/etc/pro…

前端 performance api使用 —— mark、measure计算vue3页面echarts渲染时间

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐Performance api计算持续时间&#x1f496; mark用法&#x1f496; measure用法 ⭐计算echarts渲染的持续时间⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端 performance api使用 —— mark、measure计…

刷题之最长连续序列

哈希表 class Solution { public:int longestConsecutive(vector<int>& nums) {//set记录并且去重nums中的数unordered_set<int>set;for(int i0;i<nums.size();i){set.insert(nums[i]);}int result0;//遍历所有数for(auto iset.begin();i!set.end();i){//如…

求正方形阴影部分面积

正方形边长6&#xff0c;求阴影部分面积 xy6① vw6② 1/26v1/23x1/263③ 1/26v1/26y1/266④ ③是左下角三角形的面积&#xff0c;④是左上角三角形的面积。 求解方程组得到x2 阴影部分面积1/2*3x3.

【iOS】工厂模式

文章目录 前言设计模式的三大原则简单工厂模式工厂方法模式抽象工厂模式关于三兄弟的升级与降级注意 前言 上文讲完了iOS的架构模式&#xff0c;接下来聊一聊设计模式&#xff0c;设计模式有许多&#xff0c;主要介绍一下工厂模式 设计模式的三大原则 S 单一职责原则 告诉我…

【解决Android Studio】cmake报错找不到vulkan包

1 报错信息 CMake Error at D:/Android/project/cmake/3.10.2.4988404/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:137 (message): Could NOT find Vulkan (missing: Vulkan_LIBRARY) Call Stack (most recent call first): 2. 错误原因 minSdk版本不对&am…

MySql初学日记

MySql基础 概述 结构化查询语言(Structure Query Language)简称SQL。 是一种特殊的&#xff0c;标准的数据库编程语言&#xff0c;&#xff0c;一般的数据库管理系统都支持&#xff0c;用于对数据库进行增删改查等操作&#xff0c;实现数据持久化到本地。 使用完整的管理系…

(四)Spring教程——控制反转或依赖注入与Java的反射技术

IoC的底层实现技术是反射技术&#xff0c;目前Java、C#、PHP 等语言均支持反射技术。 在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够获取到这个类的所有属性和方法&#xff1b;对任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff08;包括私有的方法…

【JavaEE】HTTP 协议

文章目录 一、HTTP 协议1、HTTP 是什么2、理解 "应用层协议"3、理解 HTTP 协议的工作过程4、HTTP 协议格式5、HTTP 请求 (Request)5.1 认识 URL 6、 二、HTTPS1、HTTPS是什么2、"加密" 是什么3、HTTPS 的工作过程3.1 对称加密3.2 非对称加密3.3 证书3.4 完…

VBA_NZ系列工具NZ06:VBA创建PDF文件说明

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

Llama 3 超级课堂 -笔记

课程文档&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 课程视频&#xff1a;https://space.bilibili.com/3546636263360696/channel/series 1 环境配置 1.1 创建虚拟环境,名为&#xff1a;llama3 conda create -n llama3 python3.10 1.2 下载、安装 pyt…

论文解读:Self-Prompt Mechanism for Few-Shot Image Recognition

文章汇总 存在的问题 由于提示文本和图像特征之间固有的模态差异&#xff0c;常规的提示方法的性能受到限制。 动机 让视觉信息自己给自己提示 解决办法 SPM涉及到图像编码器跨空间和通道维度产生的固有语义特征的系统选择&#xff0c;从而产生自提示信息。随后&#xff…

nginx反向代理使用(详细版)

1. 下载nginx&#xff0c;解压&#xff1b;&#xff08;随便放在哪里&#xff09; 2. 在nginx-1.26.0文件夹下创建web文件夹&#xff0c;继续在web文件夹下创建abcd.test.cn文件夹&#xff08;文件夹的名字就叫abcd.test.cn&#xff09;&#xff1b; 3. 配置前端代理&#xff…