C++ stack 容器适配器-栈

发布时间:2026/5/19 1:58:43

C++ stack 容器适配器-栈 stack 容器适配器#includeiostream#includestack#includevector#includedeque/* stack 容器适配器 stack 本身不是一种容器是基于容器是实现的 所有操作都在栈顶进行 top stack 本身没有迭代器 */// 使用函数模板templatetypenameTvoiddisplay(std::stackTs){while(!s.empty())// 不为空 则执行{T elems.top();//读取栈顶元素std::coutelem ;s.pop();// 弹出栈顶元素}std::coutstd::endl;};intmain(){std::stackints;for(autoi:{1,2,3,4,5})s.push(i);// 放入栈中display(s);s.push(100);// 压入元素display(s);s.pop();s.pop();display(s);// 没有清空的方法只有一个一个弹出while(!s.empty())s.pop();display(s);s.push(10);s.push(11);s.top()100;display(s);}函数 功能push(val) 向栈顶插入元素 valpop() 删除栈顶元素无返回值top() 返回栈顶元素的引用可修改empty() 判断栈是否为空空返回 truesize() 返回栈中元素的个数#includeiostreamusingnamespacestd;// 进阶版栈动态扩容 安全检查 简单封装classAdvancedStack{private:int*arr;// 动态数组替代固定数组支持扩容inttop;// 栈顶标记-1空栈intcapacity;// 当前数组容量初始为4// 私有辅助函数扩容容量翻倍voidexpand(){// 1. 新容量 原容量 * 2intnew_capcapacity*2;// 2. 分配新数组int*new_arrnewint[new_cap];// 3. 拷贝旧数据到新数组for(inti0;icapacity;i){new_arr[i]arr[i];}// 4. 释放旧数组更新指针和容量delete[]arr;arrnew_arr;capacitynew_cap;cout栈扩容啦新容量capacityendl;}public:// 构造函数初始化空栈初始容量4AdvancedStack(){capacity4;arrnewint[capacity];// 动态分配初始数组top-1;}// 析构函数释放动态数组避免内存泄漏~AdvancedStack(){delete[]arr;}// 1. 入栈自动扩容voidpush(intval){// 检查是否满了栈顶 容量-1 时扩容if(topcapacity-1){expand();}top;arr[top]val;cout入栈val当前栈顶arr[top]endl;}// 2. 出栈安全检查voidpop(){if(top-1){cout错误栈空无法出栈endl;return;}cout出栈arr[top]endl;top--;}// 3. 获取栈顶安全检查intgetTop(){if(top-1){cout错误栈空无栈顶元素endl;return-1;// 返回无效值}returnarr[top];}// 4. 判空boolisEmpty(){returntop-1;}// 5. 获取当前元素个数intsize(){returntop1;}};// 测试代码intmain(){// 极简版// // 1. 定义栈的核心数组存数据 top标记栈顶// int stack_arr[5]; // 最多存5个元素够教学用// int top -1; // top-1 表示空栈// // 2. 入栈操作压栈往栈顶加元素// top; // 栈顶标记后移// stack_arr[top] 10; // 存第一个元素10// top;// stack_arr[top] 20; // 存第二个元素20// top;// stack_arr[top] 30; // 存第三个元素30// cout 当前栈顶 stack_arr[top] endl; // 输出30最后存的// // 3. 出栈操作弹栈删除栈顶元素// top--; // 栈顶标记前移相当于删掉30// cout 出栈后栈顶 stack_arr[top] endl; // 输出20// // 4. 再出栈一次// top--;// cout 再出栈后栈顶 stack_arr[top] endl; // 输出10// // 5. 出栈到空// top--;// if (top -1) {// cout 栈空了 endl;// }AdvancedStack stack;// 1. 入栈5个元素触发扩容初始容量4第5个元素扩容到8stack.push(10);stack.push(20);stack.push(30);stack.push(40);stack.push(50);// 这里会触发扩容// 2. 访问栈顶和大小cout当前栈大小stack.size()endl;cout当前栈顶stack.getTop()endl;// 3. 出栈测试stack.pop();stack.pop();cout出栈两次后栈顶stack.getTop()endl;// 4. 出栈到空测试安全检查stack.pop();stack.pop();stack.pop();stack.pop();// 栈空触发错误提示return0;}

相关新闻