数据结构与算法学习笔记七---链栈的表示和实现(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.hqwc.cn/news/701780.html

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

相关文章

Linux shell编程学习笔记49:strings命令

0 前言 在使用Linux的过程中&#xff0c;有时我们需要在obj文件或二进制文件中查找可打印的字符串&#xff0c;那么可以strings命令。 1. strings命令 的功能、格式和选项说明 我们可以使用命令 strings --help 来查看strings命令的帮助信息。 pupleEndurer bash ~ $ strin…

开源禅道zentao的使用

很不幸禅道因为漏洞被人进攻了&#xff0c;被迫研究。 1.安装 直接使用docker进行部署&#xff0c;这里有非常多门道。官网的镜像easysoft-zentao是属于docker安装&#xff0c;而idoop的镜像虽然也是docker安装&#xff0c;但是实际是使用官网linux一键安装的版本&#xff0c…

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…

Python 全栈体系【四阶】(四十三)

第五章 深度学习 九、图像分割 3. 常用模型 3.4 DeepLab 系列 3.4.1 DeepLab v1(2015) 3.4.1.1 概述 图像分割和图像分类不一样&#xff0c;要对图像每个像素进行精确分类。在使用CNN对图像进行卷积、池化过程中&#xff0c;会导致特征图尺寸大幅度下降、分辨率降低&…

rocketmq的顺序消息开发注意事项

1. 参考消息重试&#xff0c;要对 MaxReconsumeTimes进行设置。之前就是因为没有进行设置&#xff0c;导致了队头阻塞问题。 rokcetmq和kafka一样&#xff0c;当顺序消息写入的多个队列中后&#xff0c;如果是顺序消息&#xff0c;当前的队列的队头一直消费失败的时候&#x…

PCIe规格1M/4M 1553B总线适配卡

1553B是面向测试仿真应用开发的1553B总线适配卡&#xff0c;支持1M和4M总线速率。该产品提供1 ~ 4个双冗余1553B通道&#xff0c;支持单功能/全功能。产品采用高速SRAM和大容量DDR3缓存&#xff0c;提高了总线消息的响应性能&#xff0c;可实现对多通道全功能应用以更好的支持。…

只用了三天就入门了Vue3?

"真的我学Vue3&#xff0c;只是为了完成JAVA课设" 环境配置 使用Vue3要去先下载Node.js。 就像用Python离不开pip包管理器一样。 Node.js — Run JavaScript Everywhere (nodejs.org) 下完Node.js去学习怎么使用npm包管理器&#xff0c;放心你只需要学一些基础的…

React: memo

React.memo 允许你的组件在 props 没有改变的情况下跳过重新渲染。 const MemoizedComponent memo(SomeComponent, arePropsEqual?)React 通常在其父组件重新渲染时重新渲染一个组件。你可以使用 memo 创建一个组件&#xff0c;当它的父组件重新渲染时&#xff0c;只要它的新…

「ETL实战」搭建数仓,解决多源业务系统关联分析难题(定制化业务)

在大数据分析盛行的今天&#xff0c;关联分析作为数据挖掘和业务洞察的重要手段&#xff0c;受到了极大关注。然而&#xff0c;随着数据量的激增和源业务系统的复杂性增加&#xff0c;关联分析的性能问题逐渐成为了一个不可忽视的挑战。 本文将介绍借助ETL工具&#xff0c;如何…

Ardupilot Rpanion 4GLTE 网络性能测试 - 国内中转

Ardupilot Rpanion 4GLTE 网络性能测试 - 国内中转 1. 源由2. 视频效果2.1 整体刷新率不高2.2 网络延迟可接受2.3 带宽增加丢包明显2.4 实测效果流畅 3. 总结 1. 源由 上一次&#xff0c;由于ZeroTier使用了国外服务器&#xff0c;延迟~ 569 ms&#xff0c;花屏、卡顿。 本着…

谷歌Gemini时代来了!加固搜索护城河、赋能全家桶,Gemini 1.5 Pro升级至200万token

3 月中旬&#xff0c;谷歌宣布 Google I/O 定档北京时间 5 月 15 日凌晨 1 点。而当大会开幕时间临近&#xff0c;本应是讨论度最高的时候&#xff0c;「宿敌」OpenAI 却半路杀出&#xff0c;抢先一天&#xff0c;仅耗时 27 分钟就发布了颠覆性巨作 GPT-4o&#xff0c;将新一轮…

数据结构与算法-排序算法3-插入排序

目录 1.插入排序&#xff1a; 1.介绍&#xff1a; 2.动态图解 3.举例 4.小结插入排序规则 5.插入排序代码 6.运行时间 代码&#xff1a; 运行结果&#xff1a; 1.插入排序&#xff1a; 1.介绍&#xff1a; 数组中n个元素&#xff0c;把这n个待排序元素看成一个有序序…