数据结构 - C/C++ - 栈

目录

结构特性

结构实现

结构容器

结构设计

顺序栈

链式栈


结构特性

  • 栈(stack)是线性表的一种形式,限定仅在表的一端进行插入或者删除的操作。

  • 栈顶 - 表中允许插入、删除的一端称为栈顶(top),栈顶位置是可以发生变化的。

    • 插入 - 进栈、入栈、压栈。

    • 删除 - 出栈。

  • 栈底 - 表中不允许插入、删除的一端称为栈底(bottom),栈底位置通常是固定不变的。

  • 空栈 - 表中不存在任何元素。

  • LIFO - last in first out - 先进后出、后进先出。

结构实现

  • 顺序栈
int Arr[5] = {0};[栈顶] - Arr[4]
[元素] - Arr[x]
[元素] - Arr[x]
[元素] - Arr[x]
[栈底] - Arr[0] 
  • 顺序栈使用连续的内存空间来存储元素,通常使用数组来实现。

  • 栈底指向数组起始地址(下标为0的元素)。

  • 栈顶指向当前栈中最后一个压入的元素位置。

  • 链式栈

[栈顶元素 | 指针] -> [下一个元素 | 指针] -> ... -> [栈底元素 | 空指针]

结构容器

#include <iostream>
#include <stack>int main()
{std::stack<int> myStack;std::cout << myStack.size() << std::endl;std::cout << myStack.empty() << std::endl;//入栈myStack.push(1);myStack.push(2);myStack.push(3);std::cout << myStack.size() << std::endl;std::cout << myStack.empty() << std::endl;//获取栈顶元素std::cout << myStack.top() << std::endl;//出栈myStack.pop();std::cout << myStack.top() << std::endl;return 0;
}

结构设计

顺序栈

#include <iostream>class Stack
{
public:int*    data;                   //栈的数组int     topIndex;               //栈顶索引int     capacity;               //栈的容量public:Stack();                        //默认构造函数Stack(int Size);                //有参构造函数Stack(const Stack& other);      //拷贝构造函数~Stack();                       //默认析构函数public:void Push(int value);           //入栈函数void Pop();                     //出栈函数int Top();                      //栈顶元素public:bool IsEmpty();                 //是否为空int Size();                     //元素个数};Stack::Stack() : data(nullptr), topIndex(-1), capacity(0)
{}Stack::Stack(int Size) : topIndex(-1), capacity(Size)
{this->data = new int[capacity] {};
}Stack::Stack(const Stack& other) : data(new int[other.capacity]), topIndex(other.topIndex), capacity(other.capacity)
{for (size_t i = 0; i < capacity; i++){this->data[i] = other.data[i];}
}Stack::~Stack()
{if (data != NULL){delete[] data;data = nullptr;}
}void Stack::Push(int value)
{if (Size() == capacity){//默认容量int size = capacity;//动态扩容capacity = (capacity == 0) ? 5 : capacity * 2;//申请内存int* newData = new int[capacity] {};//数据拷贝memcpy(newData, this->data, size * sizeof(int));//释放数据if (this->data != NULL){delete[] this->data;}//修正指向this->data = newData;}data[++topIndex] = value;
}void Stack::Pop()
{if (IsEmpty()){return;}--topIndex;
}int Stack::Top()
{return this->data[topIndex];
}bool Stack::IsEmpty()
{return this->topIndex == -1 ? true : false;
}int Stack::Size()
{return topIndex + 1;
}

链式栈

class Node
{
public:int value;Node* Next;Node(int Num) : value(Num), Next(nullptr) {}
};class Stack
{
public:Node* Head;public:Stack() : Head(nullptr) {}Stack(const Stack& other){if (other.Head == nullptr){Head = nullptr;}else{           Head = new Node(other.Head->value);Node* head = Head;Node* node = other.Head->Next;while (node != nullptr){head->Next = new Node(node->value);head = head->Next;node = node->Next;}}}~Stack(){Clear();}public:void Push(int value){Node* node = new Node(value);node->Next = Head;Head = node;}void Pop(){if (!IsEmpty()){Node* temp = Head;Head = Head->Next;delete temp;}}int Top(){if (!IsEmpty()){return Head->value;}}public:bool IsEmpty(){return Head == nullptr;}void Clear(){while (!IsEmpty()){Pop();}}};

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

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

相关文章

数据结构预科

在堆区申请两个长度为32的空间&#xff0c;实现两个字符串的比较【非库函数实现】 要求&#xff1a; 1> 定义函数&#xff0c;在对区申请空间&#xff0c;两个申请&#xff0c;主函数需要调用2次 2> 定义函数&#xff0c;实现字符串的输入&#xff0c;void input(char …

31 C++11

本节目标 c11简介列表初始化变量类型推导范围for循环新增加容器右值新的类功能可变参数模板 1. c11简介 在2003年标准委员会提交了一份计数勘误表&#xff08;简称TC1&#xff09;&#xff0c;使得c03这个名字已经取代了c98称为c11之前的最新的c标准名称。不过由于c03&#x…

详解归一化、标准化、正则化以及batch normalization

文章目录 what(是什么)where&#xff08;用在哪&#xff09;How&#xff08;如何用&&原理&#xff09;归一化实现方式原理示例说明 标准化实现方式原理示例说明 正则化实现方式原理作用 Batch Normalizationpytorch中的batch normalization原理BN的作用 归一化、标准化…

代理设计模式和装饰器设计模式的区别

代理设计模式: 作用:为目标(原始对象)增加功能(额外功能,拓展功能) 三种经典应用场景: 1&#xff1a;给原始对象增加额外功能(spring添加事务,Mybatis通过代理实现缓存功能等等) 2&#xff1a;远程代理&#xff08;网络通信&#xff0c;输出传输&#xff08;RPC&#xff0c;D…

【TB作品】智能台灯,ATMEGA16单片机,Proteus仿真

智能台灯 1 adc检测光强光敏电阻 显示电压 2 光强太高 也就是高于临界值 就关闭小灯 3 光强太低 也就是低于临界值 就打开小灯 3 按键修改临界值 显示 实验报告&#xff1a;基于ATMEGA16单片机的智能台灯设计与Proteus仿真 1. 实验背景 智能台灯是一种能够根据环境光强自动调…

代码随想录第40天|动态规划

完全背包 完全背包物品可以无限使用 01背包核心代码 01背包中的二维dp数组的两个for遍历可颠倒, 而一维dp数组的一定先遍历物品再遍历背包容量状态转移方程(背包容量一定为递减) 完全背包核心代码 (只在完全背包中一维dp数组嵌套顺序可颠倒, 实际题目需要确定遍历顺序) 状…

天线 有源 无源 参数

无源测试驻波比VSWR/回波损耗(Return Loss)≤2效率≥50%输入阻抗50R10%增益天线方向图3D场强图方向性 有源测试 OTA 传导测试&#xff1a;发射功率传导测试&#xff1a;接收灵敏度总辐射功率TRP(Total Radiated Power)≥发射功率减3dB总接收灵敏度TIS&#xff08;Total Isotrop…

JDBC1(JDBC相关类与接口 ​连接mysql数据库​ 测试 不同数据库厂商实现-MySQL和Oracle)

目录 一、JDBC 1. JDBC相关类与接口 1.1 DriverManager 1.2 Connection 1.3 Statement 4.ResultSet 2. JDBC工作原理 二、连接mysql数据库 1. 导入jar包 2. 使用DriverManager加载驱动类 3. Connection接口 4. Statement接口 5. ResultSet接口 ​编辑 6. 关闭并…

【鸿蒙学习笔记】基础组件Progress:进度条组件

官方文档&#xff1a;Progress 目录标题 作用最全属性迭代追加进度赋值风格样式 作用 进度条组件 最全属性迭代追加 Progress({ value: 20, total: 100, type: ProgressType.Linear }).color(Color.Green)// 颜色.width(200)// 大小.height(50)// 高度.value(50)// 进度可更…

视频转音频:怎样提取视频中的音频?6个提取音频的小技巧(建议收藏)

怎样提取视频中的音频&#xff1f;当我们想从视频中提取出声音时&#xff0c;通常会遇到很多问题。无论是想单独提取出视频里的音频&#xff0c;还是把它转成方便储存或者分享的音频格式&#xff0c;这都会涉及到视频转音频的一个需求。因此&#xff0c;在这篇指南里&#xff0…

Spring Cloud - 项目搭建

1、新建maven项目 新建maven项目&#xff0c;该项目为主项目 1、新建maven项目 2、设置项目类型 3、选择项目原型 4、设置参数 5、等着完成 2、设置项目信息 1、右键&#xff0c;项目属性 2、设置jdk版本 3、选择jdk17 4、修改编译版本 5、右键项目&#xff0c;选择maven->u…

【吊打面试官系列-MyBatis面试题】模糊查询 like 语句该怎么写?

大家好&#xff0c;我是锋哥。今天分享关于 【模糊查询 like 语句该怎么写?】面试题&#xff0c;希望对大家有帮助&#xff1b; 模糊查询 like 语句该怎么写? 第 1 种&#xff1a;在 Java 代码中添加 sql 通配符。 string wildcardname “%smi%”; list<name> names …

技术派全局异常处理

前言 全局的异常处理是Java后端不可或缺的一部分&#xff0c;可以提高代码的健壮性和可维护性。 在我们的开发中&#xff0c;总是难免会碰到一些未经处理的异常&#xff0c;假如没有做全局异常处理&#xff0c;那么我们返回给用户的信息应该是不友好的&#xff0c;很抽象的&am…

【一篇文章带你搞懂--拉链表!!!拉链表的原理是什么!】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;今天主要和大家分享一下拉链表的原理以及使用,希望对大家有所帮助。 大家可以关注我下方的链接更多优质文章供学习参考。 &#x1f49e;&#x1f49e;代码是你的画笔&#xff0c;创新是你…

Flink 运行时架构

Flink 运行时的组件 作业管理器&#xff08;JobManager&#xff09;资源管理器&#xff08;ResourceManager&#xff09;任务管理器&#xff08;TaskManager&#xff09;分发器&#xff08;Dispatch&#xff09; JobManager 控制一个应用程序执行的主进程&#xff0c;也就是说…

LiveNVR监控流媒体Onvif/RTSP用户手册-概览:CPU使用、存储使用、带宽使用、负载、内存使用、通道统计

LiveNVR监控流媒体Onvif/RTSP用户手册-概览:CPU使用、存储使用、带宽使用、负载、内存使用、通道统计 1、概览1.1、通道统计1.2、负载1.3、CPU使用1.4、存储使用1.5、带宽使用1.6、内存使用 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、概览 1.1、通道统计 显示可用通道&…

Lipschitz 连续,绝对连续

1. Lipschitz 连续 经常听到这个名词&#xff0c; Lipschitz 连续比普通连续更强&#xff0c;不仅要求函数连续&#xff0c;还要求函数的梯度小于一个正实数。 在单变量实数函数上的定义可以是&#xff1a; 对于定义域内任意两个 x 1 x_1 x1​ and x 2 x_2 x2​, 存在一个…

云计算与生成式AI的技术盛宴!亚马逊云科技深圳 Community Day 社区活动流程抢先知道!

小李哥最近要给大家分享7月7日在深圳的即将举办的亚马逊云科技生成式AI社区活动Community Day &#xff0c;干货很多内容非常硬核&#xff0c;不仅有技术分享学习前沿AI技术&#xff0c;大家在现场还可以动手实践沉浸式体验大模型&#xff0c;另外参与现场活动还可以领取诸多精…

顺序表(C语言详细版)

1. 线性表 线性表(lina list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串...... 线性表在逻辑上是线性结构&#xff0c;也就是说连续的一条直线。但是在物理结构上并…

一文汇总全球热门新闻API

新闻API通过提供快速、准确和全面的新闻内容&#xff0c;已经成为现代社会不可或缺的一部分&#xff0c;对人们的生活、工作环境和科技发展产生了深远的影响。新闻API使人们能够快速获取来自世界各地的实时新闻和信息&#xff0c;提高了信息的可访问性。通过新闻API&#xff0c…