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

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.kler.cn/news/353290.html

相关文章:

  • ros2 action server示例、拓展、练习
  • 2019年计算机网络408真题解析
  • STM32_实验5_中断实验
  • 整理一下实际开发和工作中Git工具的使用 (持续更新中)
  • 关于Linux自带的python2.6.6升级到2.7.5版本步骤详解
  • LeetCode第101题. 对称二叉树
  • Github 2024-10-13php开源项目日报 Top10
  • 美发店管理升级:SpringBoot技术实现
  • 基于yolov8、yolov5的安全帽检测系统(含UI界面、数据集、训练好的模型、Python代码)
  • QT 10.10
  • 服务器维保|思腾合力以专业力量 筑牢企业IT基石
  • 大数据面试题整理——HDFS
  • C语言笔记 18 —— 指针与数组
  • cmake Qt模板
  • dayjs日期格式化,开发uniapp或unicloud前后端进行时间格式转换
  • Linux——DNS服务器正向解析搭建教程
  • Java使用原生HttpURLConnection实现发送HTTP请求
  • Scala的flatten函数
  • Spring Boot构建高效医疗病历B2B交互平台
  • 1992-2022年全国各省产业集聚水平测算数据(含原始数据+计算过程+结果)(无缺失)
  • 【ROS实操六】launch的使用
  • python yfinance 下载金融数据,股票数据
  • 设计模式02-桥接模式(Java)
  • MySQL数据的导出
  • IJKPlayer源码分析-整体结构
  • 智慧园区管理:构建高效、安全、智能的园区环境