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

C++数据结构:stack实现

栈的实现

  • 前言
    栈是一种基础且高效的数据结构,遵循先进后出的原则。其核心操作在于压栈弹栈,分别用于在栈顶添加元素和移除栈顶元素。栈在计算机科学中广泛应用,例如在函数调用栈,表达式求值,括号匹配等场景中均发挥关键作用。本实现将详细展示栈的基本操作及其内部逻辑,通过代码与理论结合的方式,帮助读者深入理解其工作机制。

以下代码是实现stack的类,包括size(目前长度),data(指针),total(总长度)
resize(扩容函数)等。

template<typenameT>classstack{private:intsize;T*data;inttotal;voidresize();public:stack():data(newT[10]),size(0),total(10){}~stack();voidpush(T value);Tpop();Ttop()const;intgetsize()const;};

  • resize函数

对于扩容函数resize(),我们先把新的总长度变成原来的总长度的二倍。
然后申请新的空间,新的空间大小用newtotal。
然后把原来的数组的元素存到新的数组里面,然后删除原来的数组的内容,把新的newdata赋值给原来的data,这样data就指向了新的数组的首元素,此处是把指向新数组首地址的指针newdata赋值给了data,让data指向新数组的首地址。

template<typenameT>voidstack<T>::resize(){intnewTotal=total*2;T*newdata=newT[newTotal];for(inti=0;i<size;++i){newdata[i]=data[i];}delete[]data;data=newdata;total=newTotal;}

  • 析构实现
    析构函数的写法没有多余的代码,就是删除掉就好了
template<typenameT>stack<T>::~stack(){delete[]data;}

  • push函数实现
    在函数的开始先判断一下size(当前的数组的元素个数size和数组的总空间total是否相等),如果相等,那么就进入resize()函数,进行扩容,扩容后,data[size] = value,此时size = 10,然后size++,变成11.
template<typenameT>voidstack<T>::push(T value){if(size==total){resize();}data[size++]=value;}

  • pop函数实现
    进入函数先判断size(当前数组中的元素个数)是否为0,如果为0,则弹出异常提示stack是空的,否则返回size自减之后作为下标的data数据
template<typenameT>Tstack<T>::pop(){if(size==0){throwstd::underflow_error("stack is empty");}returndata[--size];}

  • top函数实现
    对于top函数我们只需要返回栈顶元素就可以了,所以我们要加一个const来保护数据。
    进入函数判断size元素个数是否为0,如果为0,则弹出异常。
    否则返回数组的元素个数减一作为下标的data数据,因为数组下标从0开始,所以10个元素的最后一个元素的下标为10 - 1 = 9;
template<typenameT>Tstack<T>::top()const{if(size==0){throwunderflow_error("stack is empty");}returndata[size-1];}

  • getsize函数实现
    对于这个函数没什么可说的,我们直接返回size,并且不要忘记加上const来保护数据。
template<typenameT>intstack<T>::getsize()const{returnsize;}

  • 总结
    以上就是stack的实现,如果你还没有搞懂指针和数组的概念和联系,可以移步我的主页,找到《另一个角度看指针》,相信会对你来说会有帮助。
http://www.cnnetsun.cn/news/1349.html

相关文章:

  • 开源存储新变局:MinIO步入维护期后的五大替代方案深度解析
  • DAY 35 官方文档的阅读
  • condition参数
  • 基于微信小程序的德育实践活动管理小程序设计与实现
  • 基于SpringBoot+Vue的护理知识在线咨询系统设计与实现
  • 基于Python+Django的社区警务信息管理系统设计与实现
  • esp32控制舵机
  • 手写 new:深入 JavaScript 对象创建机制,彻底搞懂 arguments 这个“伪装者”
  • 【计算机算法与设计(10)】习题:苹果买卖问题——分治法的经典应用
  • 【算法通关指南:算法基础篇(四)】二维差分专题:1.【模板】差分 2.地毯
  • 鸿蒙简易时钟应用
  • 大模型在手术操作后呼吸衰竭预测及围手术期方案制定中的应用研究
  • 大模型在金黄色葡萄球菌性败血症预测及围手术期管理中的应用研究
  • (附源码)基于Web的高校体育成绩管理系统设计与实现-计算机毕设 30378
  • android开发 拆分包APK的安装方式
  • Java Lambda stream reduce
  • Java入门篇,小白有任何不懂的,收藏这篇就够了
  • 对象失业半年多了,Java程序员,IT行业是不是再也找不到工作了
  • Java集合框架全面详解,从小白到精通,收藏这篇就够了
  • 探索Java设计模式:原理、应用与实践,小白到精通,收藏这篇就足够了
  • JavaWeb后端阶段项目,从小白到高级开发,收藏这篇就足够了
  • python运维自动化脚本案例,python自动化运维工具,收藏这篇就够了
  • kafka运维命令大全,零基础入门到精通,收藏这篇就够了
  • 运维简历包装,零基础入门到精通,收藏这篇就够了
  • 服务器SSH没有问题,但是VNC连接失败解决方法,收藏这篇就够了
  • 企业平台化运维能力养成记,零基础入门到精通,收藏这篇就够了
  • mysql日常运维与参数调优,零基础入门到精通,收藏这篇就够了
  • 43岁年纪的系统运维裁员后还能找到运维岗位吗?
  • 37岁前端被裁,深夜刷招聘软件的手都在抖
  • 【Paper2Slides】1:提示词分析:图片生成、内容规划、论文提取