算法与数据结构面试宝典——常见的数据结构都有哪些?详细示例(C#,C++)

文章目录

  • 一、逻辑结构:线性与非线性
    • 线性数据结构
    • 非线性数据结构
    • 访问方式
  • 二、数组(Array)
  • 三、链表(LinkedList)
  • 四、栈(Stack)
  • 五、队列(Queue)
  • 六、树(Tree)
  • 七、图(Graph)
  • 总结

在这里插入图片描述


在软件开发和算法面试中,理解和掌握常见的数据结构对于解决复杂问题至关重要。数据结构是组织和存储数据的方式,它决定了数据访问和操作的效率。本文将详细讲解在算法与数据结构面试中,C# 和 C++ 中常见的数据结构及其应用场景,并提供每个数据结构的示例代码。

一、逻辑结构:线性与非线性

线性数据结构

线性数据结构是一种简单的数据结构,其中数据元素之间的关系是一个接着一个,类似于一列排队的士兵,每个元素最多只有两个邻居:前一个和后一个。线性数据结构的典型例子包括:

  • 数组:在内存中连续存储的一组相同类型的数据项。
  • 链表:由一系列结点组成,每个结点包含数据部分和指向下一个结点的指针。
  • 栈:遵循后进先出(LIFO)原则的线性数据结构。
  • 队列:遵循先进先出(FIFO)原则的线性数据结构。

非线性数据结构

非线性数据结构中的元素之间的关系不是简单的线性关系,一个元素可以与多个其他元素相关联。非线性数据结构的典型例子包括:

  • 树:由节点组成的数据结构,每个节点有零个或多个子节点,并且没有形成闭环。
  • 图:由节点(也称为顶点)和边组成的数据结构,边可以连接任何两个节点,形成复杂的网络。

访问方式

在线性数据结构中,元素的访问通常比较直接。例如,在数组中,你可以通过索引直接访问任何元素;在链表中,你可以从头部开始,按顺序访问元素。

如下图所示,逻辑结构可被分为“线性”和“非线性”两大类。线性结构比较直观,指数据在逻辑关系上呈线性排列;非线性结构则相反,呈非线性排列。

在这里插入图片描述
(图借用https://zhuyuan11.blog.csdn.net/article/details/132911057)

二、数组(Array)

数组是一种基础的数据结构,它可以存储一系列相同类型的元素。在 C# 和 C++ 中,数组的大小是固定的,一旦创建,不能改变其大小。

C# 示例

int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
for (int i = 0; i < numbers.Length; i++)
{
    Console.WriteLine(numbers[i]);
}

C++ 示例

int numbers[] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++)
{
    std::cout << numbers[i] << std::endl;
}

应用场景:数组适用于存储固定数量的同类型元素,例如存储一年的月份、一周的天数等。

三、链表(LinkedList)

链表由一系列节点组成,每个节点包含数据部分和一个或多个指向其他节点的引用(链接)。这使得链表可以灵活地增长和缩小。

C# 示例 (使用 System.Collections.Generic.LinkedList)

LinkedList<int> linkedList = new LinkedList<int>();
linkedList.AddFirst(1);
linkedList.AddLast(2);

foreach (int value in linkedList)
{
    Console.WriteLine(value);
}

C++ 示例 (使用 std::list)

std::list<int> linkedList;
linkedList.push_front(1);
linkedList.push_back(2);

for (int value : linkedList)
{
    std::cout << value << std::endl;
}

应用场景:链表适用于需要动态调整数据大小的场景,例如在动态数组中添加或删除元素。

四、栈(Stack)

栈是一种后进先出(LIFO)的数据结构。在 C# 中,可以使用 System.Collections.Generic.Stack 类实现栈,而在 C++ 中,可以使用标准库中的 std::stack。

C# 示例

Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);

while (stack.Count > 0)
{
    Console.WriteLine(stack.Pop());
}

C++ 示例

std::stack<int> stack;
stack.push(1);
stack.push(2);

while (!stack.empty())
{
    std::cout << stack.top() << std::endl;
    stack.pop();
}

应用场景:栈适用于需要后进先出操作的场景,例如逆序打印字符串、解决递归问题等。

五、队列(Queue)

队列是一种先进先出(FIFO)的数据结构。在 C# 中使用 System.Collections.Generic.Queue,在 C++ 中使用 std::queue。

C# 示例

Queue<int> queue = new Queue<int>();
queue.Enqueue(1);
queue.Enqueue(2);

while (queue.Count > 0)
{
    Console.WriteLine(queue.Dequeue());
}

C++ 示例

std::queue<int> queue;
queue.push(1);
queue.push(2);

while (!queue.empty())
{
    std::cout << queue.front() << std::endl;
 }

六、树(Tree)

树是一种层次化的数据结构,由节点组成,每个节点包含数据和一个或多个子节点的引用。二叉树是最常见的树结构。

C# 示例 (简单的二叉树节点定义)

public class TreeNode
{
    public int Value;
    public TreeNode Left;
    public TreeNode Right;

    public TreeNode(int value)
    {
        Value = value;
    }
}

C++ 示例 (简单的二叉树节点定义)

struct TreeNode
{
    int value;
    TreeNode *left;
    TreeNode *right;

    TreeNode(int x) : value(x), left(nullptr), right(nullptr) {}
};

七、图(Graph)

图是由节点(或称为顶点)和连接这些节点的边组成的复杂数据结构。图可以是有向的也可以是无向的。

C# 示例 (使用邻接表表示图)

public class Graph
{
    public Dictionary<int, List<int>> AdjacencyList { get; set; }

    public Graph()
    {
        AdjacencyList = new Dictionary<int, List<int>>();
    }
}

C++ 示例 (使用邻接表表示图)

#include <map>
#include <vector>

class Graph
{
public:
    std::map<int, std::vector<int>> AdjacencyList;

    Graph() {}
};

以上代码展示了如何在C#和C++中定义一些常见数据结构的基本类型和结构。在实际的面试中,面试官可能会要求你实现这些数据结构的操作,如添加、删除元素,或者实现特定的算法,如排序、搜索等。掌握这些基础数据结构及其操作对于算法和数据结构面试至关重要。

在接下来的部分,你可以深入讨论每种数据结构的优缺点、时间复杂度和空间复杂度,以及如何在实际应用中使用它们。此外,还可以提供一些常见的算法示例,如排序算法(冒泡排序、快速排序等)、搜索算法(二分搜索、深度优先搜索等),以及如何在不同的数据结构上实现这些算法。

总结

本文详细讲解了C#和C++中常见的数据结构及其应用场景,并提供了示例代码。掌握这些数据结构对于算法与数据结构面试至关重要。希望读者通过本文能够更好地理解和应用这些数据结构。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android高级面试_6_性能优化

Android 高级面试-7&#xff1a;网络相关的三方库和网络协议等 1、网络框架 问题&#xff1a;HttpUrlConnection, HttpClient, Volley 和 OkHttp 的区别&#xff1f; HttpUrlConnection 的基本使用方式如下&#xff1a; URL url new URL("http://www.baidu.com")…

pytest测试框架pytest-random-order插件随机执行用例顺序

Pytest提供了丰富的插件来扩展其功能&#xff0c;本章介绍下pytest-random-order插件&#xff0c;随机设置pytest测试用例的运行顺序&#xff0c;并对随机性进行一些控制。 官方文档&#xff1a; https://pytest-cov.readthedocs.io/en/latest/index.html 适配版本说明&#x…

AI智能客服项目拆解(1) 产品大纲

本文作为拆解AI智能客服项目的首篇&#xff0c;以介绍产品大纲为主。后续以某AI智能客服产品为例&#xff0c;拆解相关技术细节。 AI智能客服是一种基于人工智能技术的客户服务解决方案&#xff0c;旨在提高客户满意度和优化企业运营。利用人工智能和自然语言处理技术&#xff…

如何为数据库中的位图添加动态水印

许多数据库存储了以blob或文件形式保存的位图&#xff0c;其中包括照片、文档扫描、医学图像等。当这些位图被各种数据库客户端和应用程序检索时&#xff0c;为了日后的识别和追踪&#xff0c;有时需要在检索时为它们添加唯一的水印。在某些情况下&#xff0c;人们甚至希望这些…

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】

数字图像处理之【高斯金字塔】与【拉普拉斯金字塔】 1.1 什么是高斯金字塔&#xff1f; 高斯金字塔&#xff08;Gaussian Pyramid&#xff09;是一种多分辨率图像表示方法&#xff0c;用于图像处理和计算机视觉领域。它通过对原始图像进行一系列的高斯平滑和下采样操作&#x…

istitle()方法——判断首字母是否大写其他字母小写

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 istitle()方法用于判断字符串中所有的单词首字母是否为大写而其他字母为小写。istitle()方法的语法格式如下&#xff1a; str.istitle() …

Java并发编程基础知识点

目录 Java并发编程基础知识点1、线程&#xff0c;进程概念及二者的关系进程相关概念线程相关概念进程与线程的关系补充小知识点&#xff1a; 2、线程的状态Java线程的状态&#xff1a;Java线程不同状态之间的切换图示 3、Java程序中如何创建线程&#xff1f;①、继承Thread类②…

【python】python知名品牌调查问卷数据分析可视化(源码+调查数据表)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

某度,网盘免费加速,复活!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 有小伙伴反馈之前如下夸克网盘脚本的加速方法失效&#xff0c;小武今天测试&#xff0c;依旧正常使用&#xff01; 百度/迅雷/夸克&#xff0c;网盘免费加速&#xff0c;已破&#xf…

Vite: 高阶特性 Pure ESM

概述 ESM 已经逐步得到各大浏览器厂商以及 Node.js 的原生支持&#xff0c;正在成为主流前端模块化方案。 而 Vite 本身就是借助浏览器原生的 ESM 解析能力( type“module” )实现了开发阶段的 no-bundle &#xff0c;即不用打包也可以构建 Web 应用。不过我们对于原生 ESM 的…

线性表与顺序存储结构(下)

前言 接上文&#xff08;线性表与顺序存储结构&#xff08;上&#xff09;&#xff09;。 这些顺序存储结构的方法在顺序表上下卷中已经提到过&#xff0c;但是有些许不同&#xff0c;可以为理解顺序表提供更丰富的视角。&#xff08;不过最主要的区别在于顺序表上下卷中的顺…

FairGuard游戏加固无缝兼容 Android 15 预览版

2024年6月25日&#xff0c;谷歌发布了 Android 15 Beta 3 &#xff0c;作为Android 15 “平台稳定性”的里程碑版本&#xff0c;谷歌建议所有应用、游戏、SDK、库和游戏引擎开发者都将“平台稳定性”里程碑版本作为规划最终兼容性测试和公开发布的目标。 安卓开发者博客提供的版…

Hadoop3:MapReduce中的ETL(数据清洗)

一、概念说明 “ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;、加载&#xff08;Load&#xff09;至目的端的过程。ETL一词较常用在数据仓库&#…

算法09 日期相关模拟算法【C++实现】

这是《C算法宝典》算法篇的第09节文章啦~ 如果你之前没有太多C基础&#xff0c;请点击&#x1f449;专栏&#xff1a;C语法入门&#xff0c;如果你C语法基础已经炉火纯青&#xff0c;则可以进阶算法&#x1f449;专栏&#xff1a;算法知识和数据结构&#x1f449;专栏&#xff…

模型预测控制:线性MPC

模型预测控制&#xff1a;线性MPC 模型预测控制&#xff08;Model Predictive Control, MPC&#xff09;是一种广泛应用于工业过程控制和自动驾驶等领域的先进控制技术。MPC通过在线解决优化问题来计算控制输入&#xff0c;从而实现系统的最优控制。本文将介绍线性MPC的系统模…

架构师篇-8、运用事件风暴进行业务领域建

如何成为优秀架构师&#xff1f; 需要有一定的技术积累&#xff0c;但是核心是懂业务。 具备一定的方法&#xff0c;并且有很强的业务理解能力。 技术架构师&#xff1a;形成技术方案&#xff0c;做的更多的是底层的平台&#xff0c;提供工具。 业务架构师&#xff1a;解决方…

Cyber Weekly #13

赛博新闻 1、谷歌发布最强开源小模型Gemma-2 本周五&#xff08;6月28日&#xff09;凌晨&#xff0c;谷歌发布最强开源小模型Gemma-2&#xff0c;分别为9B&#xff08;90亿&#xff09;和27B&#xff08;270亿&#xff09;参数规模&#xff0c;其中9B 模型在多项基准测试中均…

50-4 内网信息收集 - 本机信息收集

一、内网信息收集 内网信息收集可以从以下几个方面进行:本机信息收集、域内信息收集、内网资源探测等。通过这些步骤,我们可以全面了解当前主机的角色和所处内网的拓扑结构,从而选择更合适、更精准的渗透方案。 二、本机基础信息收集 在本机基础信息收集阶段,可以执行以下…

怎么监控公司文件?高效省力的7个办法,企业都在用

公司文件监控方法主要包括以下几个方面&#xff0c;以确保数据安全和防止文件泄密&#xff1a; 使用专业监控软件&#xff1a;如安企神等专业的企业级监控软件&#xff0c;可以详细记录员工的电脑操作&#xff0c;包括文件访问、修改、删除、复制等行为&#xff0c;以及外设使用…

RTMP推流到SRS流媒体服务器消息处理

RTMP推流到SRS流媒体服务器消息处理 SRS和客户端是怎么交换消息的&#xff1f;各个消息有什么作用&#xff1f;握手成功后&#xff0c;SRS和客户端进行消息交换&#xff0c;对应wiresharek这部分截图&#xff1a; 流程图&#xff08;之前画的&#xff0c;可能不够详细&#xf…