2026/4/18 1:04:58
网站建设
项目流程
济南网站建设哪家好,个人微信小程序开店,鹤壁seo公司,怎么知道网站关键词的搜索来源栈的实现
前言
栈是一种基础且高效的数据结构#xff0c;遵循先进后出的原则。其核心操作在于压栈和弹栈#xff0c;分别用于在栈顶添加元素和移除栈顶元素。栈在计算机科学中广泛应用#xff0c;例如在函数调用栈#xff0c;表达式求值#xff0c;括号匹配等场景中均发挥…栈的实现前言栈是一种基础且高效的数据结构遵循先进后出的原则。其核心操作在于压栈和弹栈分别用于在栈顶添加元素和移除栈顶元素。栈在计算机科学中广泛应用例如在函数调用栈表达式求值括号匹配等场景中均发挥关键作用。本实现将详细展示栈的基本操作及其内部逻辑通过代码与理论结合的方式帮助读者深入理解其工作机制。以下代码是实现stack的类包括size目前长度data指针total总长度resize扩容函数等。templatetypenameTclassstack{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指向新数组的首地址。templatetypenameTvoidstackT::resize(){intnewTotaltotal*2;T*newdatanewT[newTotal];for(inti0;isize;i){newdata[i]data[i];}delete[]data;datanewdata;totalnewTotal;}析构实现析构函数的写法没有多余的代码就是删除掉就好了templatetypenameTstackT::~stack(){delete[]data;}push函数实现在函数的开始先判断一下size当前的数组的元素个数size和数组的总空间total是否相等如果相等那么就进入resize函数进行扩容扩容后data[size] value此时size 10然后size变成11.templatetypenameTvoidstackT::push(T value){if(sizetotal){resize();}data[size]value;}pop函数实现进入函数先判断size当前数组中的元素个数是否为0如果为0则弹出异常提示stack是空的否则返回size自减之后作为下标的data数据templatetypenameTTstackT::pop(){if(size0){throwstd::underflow_error(stack is empty);}returndata[--size];}top函数实现对于top函数我们只需要返回栈顶元素就可以了所以我们要加一个const来保护数据。进入函数判断size元素个数是否为0如果为0则弹出异常。否则返回数组的元素个数减一作为下标的data数据因为数组下标从0开始所以10个元素的最后一个元素的下标为10 - 1 9templatetypenameTTstackT::top()const{if(size0){throwunderflow_error(stack is empty);}returndata[size-1];}getsize函数实现对于这个函数没什么可说的我们直接返回size并且不要忘记加上const来保护数据。templatetypenameTintstackT::getsize()const{returnsize;}总结以上就是stack的实现如果你还没有搞懂指针和数组的概念和联系可以移步我的主页找到《另一个角度看指针》相信会对你来说会有帮助。