当前位置: 首页 > news >正文

C++学习笔记(33)

三十五、栈
示例:
#include <iostream>
using namespace std;
typedef int ElemType; // 自定义链栈的数据元素为整数。
struct SNode // 链栈的结点。
{
ElemType data; // 存放结点的数据元素。
struct SNode* next; // 指向下一个结点的指针。
};
// 初始化链栈,返回值:失败返回 nullptr,成功返回头结点的地址。
SNode* InitStack()
{
SNode* head = new (std::nothrow) SNode; // 分配头结点。
if (head == nullptr) return nullptr; // 内存不足,返回失败。
head->next = nullptr; // 头结点的下一结点暂时不存在,置空。
return head; // 返回头结点。
}
// 销毁链栈。
void DestroyStack(SNode* head)
{
// 销毁链栈是指释放链栈全部的结点,包括头结点。
SNode* tmp;
while (head != nullptr)
{
tmp = head->next; // tmp 保存下一结点的地址。
delete head; // 释放当前结点。
head = tmp; // 指针移动到下一结点。
}
}
// 元素入栈,返回值:false-失败;true-成功。
bool Push(SNode* head, const ElemType& ee)
{
if (head == nullptr) { cout << "链栈不存在。\n"; return false; }
SNode* tmp = new (std::nothrow) SNode; // 分配一个新结点。
if (tmp == nullptr) return false;
tmp->data = ee; // 把元素的值存入新结点。
// 处理 next 指针。
tmp->next = head->next;
head->next = tmp;
return true;
}
// 显示链栈中全部的元素。
void PrintStack(const SNode* head)
{
if (head == nullptr) { cout << "链栈不存在。\n"; return; }
SNode* pp = head->next; // 从第 1 个结点开始。
while (pp != nullptr)
{
cout << pp->data << " "; // 如果元素为结构体,这行代码要修改。
pp = pp->next; // 指针往后移动一个结点。
}
cout << endl;
}
// 求链栈的长度,返回值:>=0-栈 SS 结点的个数。
size_t StackLength(SNode* head)
{
if (head == nullptr) { cout << "链栈不存在。\n"; return 0; }
SNode* pp = head->next; // 头结点不算,从第 1 个结点开始。
size_t length = 0;
while (pp != nullptr) { pp = pp->next; length++; }
return length;
}
// 元素出栈。
bool Pop(SNode* head,ElemType &ee)
{
if (head == nullptr) { cout << "链栈不存在。\n"; return false; }
if (head->next == nullptr) { cout << "链栈为空,没有结点。\n"; return false; }
SNode* pp = head->next; // pp 指向第一个节点。
head->next = head->next->next; // 修改头结点的 next 指针。
ee = pp->data;
delete pp; // 删除第一个节点。
return true;
}
int main()
{
SNode* SS = InitStack(); // 初始化链栈 SS。
cout << "入栈三个元素(1、2、3)。\n";
Push(SS, 1);
Push(SS, 2);
Push(SS, 3);
PrintStack(SS); // 把链栈中全部的元素显示出来。
cout << "链栈的长度:" << StackLength(SS) << endl;
// 元素出栈。
ElemType ee;
Pop(SS,ee);
cout << "出栈的元素的值是:" << ee << endl;
DestroyStack(SS); // 销毁链栈 SS。
}
 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JVM常用参数配置
  • python中的排序函数sorted
  • 【资料分析】刷题日记2
  • 系统在哪些情况下会触发缺页中断
  • 关于Java数据结构中集合的一个小知识
  • 八股文-JVM
  • Gitlab实现多项目触发式自动CICD
  • 机器学习:逻辑回归--过采样
  • 教育培训小程序开发,简单实用的入门指南
  • AI绘画与摄影新纪元:ChatGPT+Midjourney+文心一格 共绘梦幻世界
  • 机器学习与深度学习之间的区别
  • 诗文发布模板(python代码打造键盘录入诗文自动排版,MarkDown源码文本)
  • 职场 Death Note
  • 鸿蒙媒体开发系列06——输出设备与音频流管理
  • RK3568平台(网络篇)MAC地址烧录
  • @angular/forms 源码解析之双向绑定
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 0基础学习移动端适配
  • 77. Combinations
  • Android框架之Volley
  • docker容器内的网络抓包
  • DOM的那些事
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java小白进阶笔记(3)-初级面向对象
  • Laravel5.4 Queues队列学习
  • Node项目之评分系统(二)- 数据库设计
  • python docx文档转html页面
  • vue 配置sass、scss全局变量
  • Webpack 4x 之路 ( 四 )
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 构建二叉树进行数值数组的去重及优化
  • 使用SAX解析XML
  • 数据科学 第 3 章 11 字符串处理
  • 微信小程序--------语音识别(前端自己也能玩)
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 正则表达式小结
  • 正则与JS中的正则
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 正则表达式-基础知识Review
  • ​数据链路层——流量控制可靠传输机制 ​
  • #13 yum、编译安装与sed命令的使用
  • #NOIP 2014# day.1 T2 联合权值
  • #ubuntu# #git# repository git config --global --add safe.directory
  • ( 10 )MySQL中的外键
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm高校实验室 毕业设计 800008
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (理论篇)httpmoudle和httphandler一览
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十一)图像的罗伯特梯度锐化