C++数据结构1——栈结构详解

一、栈的基本概念与特性

1. 栈的定义与特点

栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的线性数据结构,其核心特征包括:

  • 单端操作:所有操作仅通过栈顶进行

  • 动态存储:无需预先分配固定空间

  • 使用方法

          通过对象. 函数 的方式调用 ,需要导入头文件  #include <stack>
  • 定义类型           stack  <类型>   名称;   
           例如stack  <int>  s;   //s是一个栈,这个栈里的每一个元素都是 int类型
  • 声明与使用
    • 声明一个stack类型的对象(变量)  stack<int> s;

    • 栈声明完毕,是空栈,需要往里面添加数据

           s.push(i)

      s.pop()   出栈

      s.top()  获取栈顶元素,但并不出栈

      s.size()   当前栈里有多少元素

      s.empty()   判断栈是否为空,为空返回true, 不空返回false

2. 栈的物理结构

栈就是一个容器,这个容器只有一端开放,进出都必须经由开放的这一端,开放端,称为栈顶,

不开放的,称为栈底


二、数组模拟栈与STL栈对比

1. 数组模拟栈实现(十进制转二进制)

#include <iostream>
using namespace std; int main() { int n; int s[50] = {0};      // 存储二进制位的数组int top = 0;          // 栈顶指针(初始为0)cin >> n; if(n == 0) {          // 处理特殊值cout << 0;return 0;}while (n > 0) { s[top] = n % 2;   // 存储余数top++;            // 栈顶上移n /= 2; } // 逆序输出while (top > 0) { cout << s[top - 1]; top--;            // 栈顶下移}return 0; 
}
关键点解析
变量作用操作逻辑
s[50]模拟栈存储空间静态数组预分配
top栈顶指针top++表示入栈
n待转换的十进制数通过连续除2取余

2. STL栈实现(通用进制转换)

#include <iostream>
#include <stack>
using namespace std;int main() {int n, m;cin >> n >> m;        // 输入数值和进制基数stack<int> s;         // 声明整型栈if(n == 0) {          // 处理边界条件cout << 0;return 0;}while(n > 0) {s.push(n % m);    // 余数入栈n /= m;}while(!s.empty()) {   // 栈非空时循环cout << s.top();  // 输出栈顶元素s.pop();          // 移除栈顶元素}return 0;
}
核心方法对比
操作数组模拟栈STL栈
入栈s[top++] = values.push(value)
出栈top--s.pop()
查看栈顶s[top-1]s.top()
空栈判断top == 0s.empty()
内存管理手动控制自动扩容

三、C++标准库栈容器详解

1. 模板化声明

#include <stack>// 声明不同类型的栈
stack<int> intStack;       // 整型栈
stack<double> doubleStack; // 双精度浮点栈
stack<char> charStack;     // 字符栈(适用于16进制)

2. 核心方法说明

方法功能描述示例
push(val)元素入栈s.push(10)
pop()移除栈顶元素s.pop()
top()返回栈顶元素(不删除)int x = s.top()
empty()判断栈是否为空if(s.empty()){...}
size()返回当前元素数量cout << s.size()

3. 类型安全示例

stack<string> historyStack;// 浏览器历史记录管理
historyStack.push("首页");
historyStack.push("商品详情页");
historyStack.push("购物车");// 模拟返回按钮操作
while(!historyStack.empty()) {cout << "返回至:" << historyStack.top() << endl;historyStack.pop();
}

四、实战技巧与注意事项

1. 调试常见问题

  • 栈空访问:调用top()pop()前必须检查空栈

    if(!s.empty()) {int val = s.top();s.pop();
    }
  • 数值溢出:处理大数时使用long long类型

  • 进制范围:确认基数在合法范围内(2-16)

2. 性能优化建议

场景优化策略
高频入栈/出栈预分配内存(数组栈)
大数转换使用字符串存储中间结果
多线程环境采用线程安全容器

3. 扩展应用场景

  • 表达式求值:处理括号匹配、运算符优先级

  • 撤销/重做:记录操作历史

  • 递归转迭代:用栈模拟递归调用过程


五、综合对比与选择建议

考量维度数组模拟栈STL标准栈
学习成本需理解指针操作接口简单易用
内存控制手动管理(易出错)自动扩容(更安全)
执行效率直接内存访问(略快)有封装开销(可忽略)
功能扩展可定制特殊功能受限于标准接口
适用场景教学演示、嵌入式开发商业项目、快速开发

通过掌握数组模拟栈的实现原理与STL栈的标准用法,开发者可以灵活选择适合的栈实现方式。建议在算法竞赛中优先使用STL栈提升开发效率,在学习阶段通过手动实现加深对底层原理的理解。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34136.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

77.HarmonyOS NEXT ImageViewerView 组件深度剖析: Swiper容器与懒加载深度解析

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT ImageViewerView 组件深度剖析&#xff1a; Swiper容器与懒加载深度解析 一、组件基础结构 Component export struct ImageViewe…

向量数据库对比以及Chroma操作

一、向量数据库与传统类型数据库 向量数据库&#xff08;Vector Storage Engine&#xff09;与传统类型的数据库如关系型数据库&#xff08;MySQL&#xff09;、文档型数据库&#xff08;MongoDB&#xff09;、键值存储&#xff08;Redis&#xff09;、全文搜索引擎&#xff0…

深入解析对象存储及工作原理

在现代信息技术发展中&#xff0c;存储是一个永恒的话题。从最初的磁带、硬盘到现在的云存储&#xff0c;存储技术不断推陈出新。而其中&#xff0c;“对象存储”作为近年来备受关注的存储技术之一&#xff0c;凭借其高可扩展性和灵活性&#xff0c;逐渐成为企业级存储方案的首…

ctfshow-xxs-316-333-wp

316.反射型 XSS&#xff08;-326都是反射型&#xff09; js恶意代码是存在于某个参数中&#xff0c;通过url后缀进行get传入&#xff0c;当其他用户点进这个被精心构造的url链接时&#xff0c;恶意代码就会被解析&#xff0c;从而盗取用户信息。 来看题&#xff0c;先简单测试…

easypoi导入Excel兼容日期和字符串格式的日期和时间

问题场景 在使用easypoi导入Excel时&#xff0c;涉及到的常用日期会有yyyy-MM-dd HH:mm:ss、yyyy-MM-dd和HH:mm:ss&#xff0c;但是Excel上面的格式可不止这些&#xff0c;用户总会输入一些其他格式&#xff0c;如 如果在定义verify时用下面这种格式定义&#xff0c;那么总会…

基于yolo11+flask打造一个精美登录界面和检测系统

这个是使用flask实现好看登录界面和友好的检测界面实现yolov11推理和展示&#xff0c;代码仅仅有2个html文件和一个python文件&#xff0c;真正做到了用最简洁的代码实现复杂功能。 测试通过环境&#xff1a; windows x64 anaconda3python3.8 ultralytics8.3.81 flask1.1.…

R语言零基础系列教程-01-R语言初识与学习路线

代码、讲义、软件回复【R语言01】获取。 R语言初识 R是一个开放的统计编程环境&#xff0c;是一门用于统计计算和作图的语言。“一切皆是对象”&#xff0c;数据、函数、运算符、环境等等都是对象。易学&#xff0c;代码像伪代码一样简洁&#xff0c;可读性高强大的统计和可视…

AI重塑视觉艺术:DeepSeek与蓝耘通义万相2.1的图生视频奇迹

云边有个稻草人-CSDN博客 近年来&#xff0c;深度学习、计算机视觉和生成模型在多个领域取得了突破性进展。其中&#xff0c;DeepSeek与蓝耘通义万相2.1图生视频的结合为图像生成与视频生成技术提供了新的发展方向。DeepSeek作为一个图像和视频生成的工具&#xff0c;能够利用深…

ELK+Filebeat+Kafka+Zookeeper安装部署

1.安装zookeeper zookpeer下载地址:apache-zookeeper-3.7.1-bin.tar.gzhttps://link.csdn.net/?targethttps%3A%2F%2Fwww.apache.org%2Fdyn%2Fcloser.lua%2Fzookeeper%2Fzookeeper-3.7.1%2Fapache-zookeeper-3.7.1-bin.tar.gz%3Flogin%3Dfrom_csdn 1.1解压安装zookeeper软件…

历年云南大学计算机复试上机真题

历年云南大学计算机复试机试真题 在线评测&#xff1a;传送门&#xff1a;pgcode.cn 喝饮料 题目描述 商店里有 n 中饮料&#xff0c;第 i 种饮料有 mi 毫升&#xff0c;价格为 wi。 小明现在手里有 x 元&#xff0c;他想吃尽量多的饮料&#xff0c;于是向你寻求帮助&#x…

怎么有效降低知网AIGC率

在学术创作日益规范且数字化检测技术不断发展的当下&#xff0c;知网 AIGC 检测成为了众多创作者关注的焦点。许多人苦恼于如何有效降低知网 AIGC 率&#xff0c;让自己的作品在通过检测的同时&#xff0c;彰显出真实的创作水平与独特性。接下来&#xff0c;我们就深入探讨降低…

代码随想录day17 二叉树part05

654.最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums …

【Python入门】一篇掌握Python中的字典(创建、访问、修改、字典方法)【详细版】

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《Python/PyTorch极简课》_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目…

LeetCode 环形链表II:为什么双指针第二次会在环的入口相遇?

快慢指针 为什么相遇后让快指针回到起点&#xff0c;再让快指针和慢指针都一步一步地走&#xff0c;它们就会在环的入口相遇&#xff1f; 复杂度 时间复杂度: O(n) 空间复杂度: O(1) public ListNode detectCycle(ListNode head) {ListNode slow head, fast head;ListNode …

HarmonyOS第24天:鸿蒙应用安全秘籍:如何为用户数据筑牢防线?

开篇引入 在数字化时代&#xff0c;我们的生活越来越依赖各种应用程序。从社交娱乐到移动支付&#xff0c;从健康管理到工作学习&#xff0c;应用已经渗透到生活的方方面面。然而&#xff0c;随着应用使用的日益频繁&#xff0c;用户隐私数据泄露的风险也在不断增加。 前几年&…

P2730 魔板 (写了巨久..有一些数字,字符,字符串之间的转换规则)

ac代码&#xff1a; #include<iostream> #include<map> #include<queue> using namespace std; map<string,int>mp1,mp2; map<string,string>mp3; queue<string>q; string str,res"12345678"; void pri(string str){if(resstr)…

Centos7使用docker搭建redis集群

前置准备&#xff1a; Centos7安装docker就不多说了… 本次目的是搭建3主3从&#xff08;当然你也可以按需扩展&#xff09;准备三台服务器&#xff0c;假定IP分别为&#xff1a;192.168.75.128、192.168.75.129、192.168.75.130安装 redis&#xff1a; #拉取redis docker p…

Java 用While语句判断密码是否输入正确

package com.MyJava; import java.util.Scanner;public class While {public static void main(String[] args) {Scanner Myscan new Scanner(System.in); int i 0,n 3; //n为有效密码次数System.out.print("请输入密码&#xff1a;");String Password Myscan.ne…

Browser Copilot 开源浏览器扩展,使用现有或定制的 AI 助手来完成日常 Web 应用程序任务。

一、软件介绍 文末提供源码和开源扩展程序下载 Browser Copilot 是一个开源浏览器扩展&#xff0c;允许您使用现有或定制的 AI 助手来帮助您完成日常 Web 应用程序任务。 目标是提供多功能的 UI 和简单的框架&#xff0c;以实现和使用越来越多的 copilots&#xff08;AI 助手&…

探索Maas平台与阿里 QWQ 技术:AI调参的魔法世界

摘要&#xff1a;本文介绍了蓝耘 Maas 平台在人工智能领域的表现及其核心优势&#xff0c;包括强大的模型支持、高效的资源调度和友好的操作界面。文章还探讨了蓝耘 Maas 平台与阿里 QWQ 技术的融合亮点及应用拓展实例&#xff0c;并提供了调参实战指南&#xff0c;最后对蓝耘 …