2.3.2 出栈出栈时需要检查栈是否为空,为空时,出栈失败 。不为空时,把位置控制指针向后移动到数据所在位置,然后得出数据 。
//出栈T pop() { if(this->isEmpty()) { //栈为空 return NULL; } this->index--; this->size--; return *(this->index);}2.3.3 其它函数返回栈中实际数据的函数 。
//得到栈中的实际数据大小int getSize(){ return this->index-this->items;}仅查询栈顶数据,不从栈中删除数据 。
//查看栈顶数据T getTop() { if(this->isEmpty()) { return NULL; } return *(this->index-1);}2.3.4 测试入栈出栈栈存储会导致存入的顺序和输出的顺序是相反的 。
int main(int argc, char** argv) { Stack<int> myStack(10); //向栈中压入数据 for(int i=0; i<15; i++) { myStack.push(i); } int top=myStack.getTop(); cout<<"栈顶数据:"<<top<<endl; int size=myStack.getSize(); cout<<"栈中数据的大小:"<<size<<endl; cout<<"输出栈中所有数据:"<<endl; for(int i=0; i<15; i++) { cout<<myStack.pop()<<endl; } return 0;}输出结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MEHtsaDR-1665378597891)(D:\红泥巴\我的课程体系\(信息奥赛)课程体系\第一阶段:入门级(CSP-J)\第三部分:数据结构\1_第一章节:线性表\教学教案\栈的图片\3.png)]
向栈中添加了 15 次数据,因栈的容量只有 10,最终输出只有 10 个有效数据 。最后的 5 个 0 表示出栈失败 。
2.4 小结因顺序栈基于数组,实现过程相对而言较简单,但受限于数组的物理特性,在压入的数据多于栈内部大小时,会出现数据溢出问题 。虽然可以采用扩容算法,但同时增加了代码的维护量 。
3. 链式存储链式存储是基于结点的存储方式,数据在物理结构上是不连续的 。链表存储的优点是可以自行动态扩容,不需要算法层面的支持 。
链式存储的流程:
3.1 结点类型结点类型和单链表相同,只需要数据域和存储下一个结点的指针域 。
template <typename T>class Node { public:T data;Node *next;Node(T data) {this->data=https://www.huyubaike.com/biancheng/data;this->next=NULL;}};3.2 初始化创建链表时,通常会增加一个空白头结点作为标志结点,在构建链表栈时是不需要的 。
template <typename T>class Stack { private://头结点指针Node *head;//栈中实际数据的大小int size; public://构造函数Stack() { //不需要空白头结点this->head=NULL; this->size=0;}//入栈bool push(T data) ;//出栈T pop() ;//查看栈顶数据T getTop() ;//得到栈中的实际数据大小int getSize(){ return this->size; }};
经验总结扩展阅读
- 免疫力失衡怎么调理
- 湿法和干法的区别
- 概率和概率单位的区别是什么啊
- vivoX70pro和苹果11区别对比_哪款更值得入手
- 小米10s和小米10拍照哪个好_小米10s和小米10拍照对比
- 射手座的缺点和优点
- vivox70pro+和小米11Ultra那个好_详细对比
- 醇和浓硫酸共热是什么反应
- 表柔比星和多柔比星的区别
- 蒸饺怎么和面好窍门