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

C、C++常用数据结构:栈

  1. 栈:(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构。
  2. 栈的本质是一种线性表。
  3. 添加元素,称为入栈(push);删除元素,称为出栈(pop)。
  4. 栈可以用顺序存储实现,也可以用链式存储实现,分别成为顺序栈和链栈。但一般使用顺序存储实现,因为栈不允许在栈中间进行插入和删除
  5. 栈数据结构有两种初始化方式,一种是动态初始化,另一种是静态初始化。

动态初始化和静态初始化对比

1. 内存分配方式

  • 动态初始化:栈的大小在运行时确定,通常使用动态内存分配(如newmalloc)来实现。栈的内存从中分配,而不是栈帧或全局数据段。(重点是从堆中分配内存)。可以根据实际需要调整栈的大小。例如int* stack = new int[100];
  • 静态初始化:栈的大小在编译时确定,通常使用数组来实现,并且在栈帧全局数据段中分配内存。一旦栈的大小确定,就不能再改变。例如:int stack[100];

2. 性能对比

  • 动态初始化:由于涉及动态内存分配(如newdelete),分配和释放速度较慢,并且有内存碎片的可能。
  • 静态初始化:因为内存是在栈上或全局段中分配的,分配和释放的速度非常快

代码示例

动态初始化

#include <iostream>using namespace std;/*** 动态内存分配栈*/
class DynamicStack
{
private:int *stack;int top;int maxsize;public:DynamicStack(int size) : top(-1), maxsize(size){stack = new int[size];}bool isEmpty(){return top == -1;}bool isFull(){return top == maxsize - 1;}void push(int val){if (isFull()){cout << "动态分配的栈已满(达到最大值)" << endl;return;}stack[++top] = val;cout << stack[top] << "入栈" << endl;}void pop(){if (isEmpty()){cout << "栈为空,不能pop" << endl;return;}cout << stack[top] << "出栈" << endl;top--;}int getTop(){if (isEmpty()){cout << "栈为空,不能getTop" << endl;return -1;}return stack[top];}
};int main(int argc, char const *argv[])
{DynamicStack dystack(5);dystack.push(11);dystack.push(25);dystack.push(36);cout << "栈顶:" << dystack.getTop() << endl;dystack.pop();dystack.pop();dystack.pop();return 0;
}

静态初始化

#include <iostream>using namespace std;#define MAXSIZE 100/*** 静态内存分配栈*/
class StaticStack
{
private:int stack[MAXSIZE];int top;public:StaticStack() : top(-1) {}bool isEmpty() { return top == -1; }bool isFull() { return top == MAXSIZE - 1; }void push(int value){if (isFull()){cout << "栈已满" << endl;return;}stack[++top] = value;cout << stack[top] << "入栈" << endl;}void pop(){if (isEmpty()){cout << "栈为空" << endl;return;}cout << stack[top] << "出栈" << endl;top--;}int getTop(){if (isEmpty()){cout << "栈为空" << endl;return 0;}return stack[top];}
};int main(int argc, char const *argv[])
{/* code */StaticStack static_stack;static_stack.push(11);static_stack.push(25);static_stack.push(36);cout << "栈顶:" << static_stack.getTop() << endl;static_stack.pop();static_stack.pop();static_stack.pop();return 0;
}

C++的标准库<stack>

以上通过编写栈的相关代码,只是为了更直观和简单地理解栈数据结构,实际上,在 C++ 中,可以使用标准库 <stack> 提供的 stack 模板来创建和操作栈。

  1. stack 是一个模板类,可以用来存储任何类型的数据(如 intdouble、自定义对象等)。例如:stack<int> s;
  2. stack 的一些基本操作:
    • push: 将元素压入栈顶。
    • pop: 移除栈顶元素。
    • top: 获取栈顶元素的值(但不移除)。
    • empty: 检查栈是否为空。
    • size: 获取栈中元素的数量。

http://www.mrgr.cn/news/49290.html

相关文章:

  • 京东商品SKU详情接口测试||电商API商品详情接口测试【附代码】
  • Enemy Golem 卡通石头人怪物模型带骨骼动画动作
  • 硬件层次结构并行情况
  • CAN 总线通信,如何实现应用层的应答机制
  • ROS2 通信三大件之动作 -- Action
  • 深入探讨ExcelToWord邮件合并工具,解锁高效办公新技能
  • 解决关闭create_ap配置的无线网卡AP模式后,无法恢复到无线网卡的基础模式
  • B3631 单向链表
  • Stm32 can总线协议学习,原子教程
  • 【AI论文精读13】RAG论文综述2(微软亚研院 2409)P5-可解释推理查询L3
  • 开关电源调制模式和工作模式
  • 【Python随笔】pyside6绘制表盘和数字时钟的方法
  • 【亲测可行】最新ubuntu搭建rknn-toolkit2
  • [LeetCode] 5. 最长回文字串
  • 20240730 联发科 笔试
  • 外卖点餐系统小程序的设计
  • 架构设计笔记-10-软件架构的演化和维护
  • 智慧乡村可视化设计,让美丽的乡村更加魅力。
  • PAT甲级1007 Maximum Subsequence Sum
  • 24/10/13 算法笔记 批量规范化