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.mzph.cn/bicheng/73492.shtml

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

相关文章

【Python 数据结构 15.哈希表】

目录 一、哈希表的基本概念 1.哈希表的概念 2.键值对的概念 3.哈希函数的概念 4.哈希冲突的概念 5.常用的哈希函数 Ⅰ、直接定址法 Ⅱ、平方取中法 Ⅲ、折叠法 Ⅳ、除留余数法 Ⅴ、位与法 6.哈希冲突的解决方案 Ⅰ、开放定址法 Ⅱ、链地址法 7.哈希表的初始化 8.哈希表的元素插…

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

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

[文献阅读] 可变形卷积DCN - Deformable Convolutional Networks

**文献信息&#xff1a;**Deformable Convolutional Networks arxiv.org/abs/1703.06211 发表于ICCV 2017&#xff0c;提出了可变形卷积DCN&#xff08;Deformable ConvNets&#xff09; 摘要 卷积神经网络&#xff08;CNN&#xff09;由于其构建模块固定的几何结构天然地局限…

德语A1学习

Hast du morgen Zeit? Wann spielen wir? Vocabulary etwas/jemanden brauchen braucht, brauchte, hat gebraucht to need something/somebody Das geht. That works./Thats OK. den ganzen Tag the entire day dieser, diese, dieses this erst just; only G…

路局的上道检修过程中,利用AI视觉技术对轨道两旁设备设施进行检修

在铁路局的上道检修过程中,利用AI视觉技术对轨道两旁设备设施(如信号设备、电缆、接触网、通信设备等)以及铁路上方的电线(如接触网、电力线)进行异常检测,可以显著提高检修效率、降低人工成本并增强安全性。以下是具体的应用方案和技术路径: 1. 应用场景 1.1 轨道两旁…

函数指针/逗号表达式/不用if语句完成的字母输出题

1.函数指针用的不是那么频繁的一个操作&#xff1a; 下面是代码演示&#xff1a; 在这个int (*jump)(int);中 jump是这个指针变量名称&#xff0c;第一个int是指针类型&#xff0c;第二个int是指的这个指针所指的函数参数是int类型的。 #include <stdio.h>// 定义一个…

uniapp报毒

uniapp打包的apk&#xff0c;装机量多了就开始报毒&#xff0c;尝试了多种解决办法都无解&#xff01;&#xff01; 去某宝&#xff0c;解决一次50-100不等&#xff0c;并且没有售后&#xff0c;掉了重新做包&#xff0c;很是无解&#xff0c;包月价格更是离谱。 为此自行测试…

IIS EXPRESS 虚拟目录经验谈!

最近在给客户开发一个事件提醒软件&#xff0c;用的是c# 版本是vs2022&#xff0c;在运行调试程序时&#xff0c;电脑会自动启动IIS Express,电脑右小角出现两个虚拟目录&#xff0c;对应两个端口&#xff0c;图示如下&#xff1a; 只能点击选择http://localhost:52726&#xf…

小程序配置

注册小程序账号和安装开发工具 参考文档&#xff1a;注册小程序账号和安装开发工具https://blog.csdn.net/aystl_gss/article/details/127878658 HBuilder新建项目 填写项目名称&#xff0c;选择UNI-APP&#xff0c;修改路径&#xff0c;点击创建 manifest.json 配置 需要分别…

左叶子之和 找左下角的值 路径总和

1.计算给定二叉树的所有左叶子之和。 #include <bits/stdc.h> using namespace std; struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int x) { valx; leftNULL; rightNULL; } }; int findsum(T…

Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测

SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测 目录 SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME-CNN-LSTM-Multihead-Attention霜冰算法…

996引擎-自定义属性-方法2:setitemcustomabil

996引擎-自定义属性-方法2:setitemcustomabil 先看下效果测试NPC补全测试代码辅助表公式setitemcustomabil 总结参考资料先看下效果 测试NPC 为了方便测试,先准备个NPC require("Envir/QuestDiary/ex/init.lua"); require("Envir/QuestDiary/utils/init.lu…

苹果电脑杀毒软件CleanMyMac

杀毒软件在苹果家族中是一个小众软件&#xff0c;百度搜索苹果电脑杀毒软件&#xff0c;可能各种杀软良莠不齐&#xff0c;因为在这个市场非常小&#xff0c;绝大多数都是冲着“清理”去的&#xff0c;而不是杀毒。最近测试了一款Mac电脑杀毒软件&#xff0c;杀毒效果也是一般般…

pandas表格内容比较

前阵子来了一个211大学实习生&#xff08;小男生&#xff09;&#xff0c;要比较2个版本字段的变化&#xff0c;辅助完成系统升级字段替换&#xff0c;要求找出哪些字段是新增的&#xff0c;哪些字段是删除的&#xff0c;哪些字段是属性信息修改的&#xff0c;要求半天时间搞定…

【SpringBoot】最佳实践——JWT结合Redis实现双Token无感刷新

JWT概览 JWT概念 JWT是全称是JSON WEB TOKEN&#xff0c;是一个开放标准&#xff0c;用于将各方数据信息作为JSON格式进行对象传递&#xff0c;可以对数据进行可选的数字加密&#xff0c;可使用RSA或ECDSA进行公钥/私钥签名。JWT最常见的使用场景就是缓存当前用户登录信息&am…

面试系列|蚂蚁金服技术面【1】

哈喽&#xff0c;大家好&#xff01;今天分享一下蚂蚁金服的 Java 后端开发岗位真实社招面经&#xff0c;复盘面试过程中踩过的坑&#xff0c;整理面试过程中提到的知识点&#xff0c;希望能给正在准备面试的你一些参考和启发&#xff0c;希望对你有帮助&#xff0c;愿你能够获…

eBPF 实时捕获键盘输入

eBPF 实时捕获键盘输入 本文将带你一步步实现一个基于eBPF kprobe的键盘记录功能&#xff0c;通过Go语言配合libbpfgo&#xff0c;你将学会如何无损地监控系统键盘输入&#xff0c;并从中获取实时数据&#xff0c;进一步提高系统安全和监控能力。 1. 说明 本文属于专栏 Go语言…

APB-清华联合腾讯等机构推出的分布式长上下文推理框架

APB (Accelerating Distributed Long-Context Inference by Passing Compressed Context Blocks acrossGPUs)是清华大学等机构联合提出的分布式长上下文推理框架。通过稀疏注意力机制和序列并行推理方式&#xff0c;有效解决了大模型处理长文本时的效率瓶颈。APB采用更小的Anch…

数据库分库分表介绍

分库分表是解决数据库性能瓶颈的常用技术手段&#xff0c;主要用于应对数据量过大、读写压力过高的问题。通过将数据分散到多个数据库或表中&#xff0c;可以提高系统的扩展性和性能。 1. 分库分表的核心概念 &#xff08;1&#xff09;分库 定义&#xff1a;将数据分散到多个…

#mapreduce打包#maven:could not resolve dependencies for project

打包报错&#xff1a; #报错信息&#xff1a; [ERROR] Failed to execute goal on project mapreduce_teacher1: Could not resolve dependencies for project org.example:mapreduce_teacher1:jar:1.0-SNAPSHOT: Failed to collect dependencies at org.apache.hive:hive-exe…