数据结构—————栈(unity)

最近有老铁跟我讲自己对数据结构不熟悉,而且市面上一些学习资料比较难理解,让我给他讲一下数据结构,我考虑了一下,决定在接下来的日子,开启一个新的工程,用我们熟悉的unity把涉及到的数据结构都讲一下,其中我会附带一些简单的例子,或者一些小游戏,来说明数据结构,希望能帮助大家更好的理解。这一篇我先讲比较简单常用的数据结构——栈:

我们先看看百度百科的解释:

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

要搞清楚这个概念,首先要明白”栈“原来的意思,如此才能把握本质。"栈“者,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。

一直往瓶子里面装东西,取出来的时候,只有先把最上面的东西取出来,才能取到底部的东西

下面我写一个简单的例子来理解一下这个栈,生成几个球,想象是在一个瓶子里,我们一个个取出小球:

自己试验一下,下面是代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class StackManager : MonoBehaviour
{
    [SerializeField] private Button delete_btn;
    [SerializeField] private GameObject ball;
    private Stack<GameObject>myStack=new Stack<GameObject>();
	// Use this for initialization
	void Start () {
	    for (int i = 0; i < 5; i++)
	    {
	        GameObject go = Instantiate(ball, new Vector3(0, i, 0), gameObject.transform.rotation);
            myStack.Push(go);
	    }
        delete_btn.onClick.AddListener(() =>
        {
            if (myStack.Count > 0)
            {
                GameObject top_go = myStack.Pop();
                Destroy(top_go);
            }
           
        });
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

push是入栈:

pop是取栈顶元素,并删除,还有一个方法是peek也是取栈顶元素,但是不删除

最后我把例子工程上传了github:  https://github.com/Leemu0822/UnityDataStruct

会一直更新,把所有常用的数据结构都会写一个例子出来,持续更新,希望对大家有用:

如果需要python写的兄弟,可以给我留言

### 关于 Unity数据结构的面试题目 #### 数组的理解及其应用 数组是一种线性数据结构,在 Unity 开发中被广泛用于存储一系列相同类型的元素。创建和初始化一个整数数组可以如下所示: ```csharp int[] numbers = new int[5]; numbers[0] = 1; ``` 在实际开发过程中,可能会遇到这样的问题:“在一个场景中有多个游戏对象需要按照特定顺序执行某些操作,应该如何管理这些对象?” 使用数组来保存 GameObjects 是一种常见做法[^2]。 #### 列表(List<T>) 和字典(Dictionary<TKey,TValue>) 除了基本的数组外,C# 提供了更灵活的数据容器——`List<T>` 和 `Dictionary<TKey,TValue>`. 这些高级集合类允许动态调整大小并提供了更多实用方法来进行增删查改等操作。 对于 List 类型而言,常见的应用场景之一是在运行时收集或移除场景内的实体;而 Dictionary 更适合用来建立键值对映射关系,比如关联不同 ID 对应的游戏资源实例。 ```csharp // 定义一个字符串列表 var stringList = new System.Collections.Generic.List<string>(); stringList.Add("Item One"); // 创建一个简单的字典 var dictionaryExample = new System.Collections.Generic.Dictionary<int, string>(); dictionaryExample.Add(1, "First Entry"); ``` #### 自定义数据结构设计 有时标准库中的数据结构并不能完全满足项目需求,这时就需要开发者自行实现新的数据类型。例如,在处理复杂地形或者网格布局时可能要用到自定义的二维坐标系或是基于节点(Node)构建的地图表示法。 考虑这样一个案例:如果要模拟棋盘上的单位移动逻辑,则可以通过定义 Position 结构体来简化位置计算过程: ```csharp public struct Position { public int X { get; set; } public int Y { get; set; } public override bool Equals(object obj){ var otherPos = (Position)obj; return this.X == otherPos.X && this.Y == otherPos.Y; } public static bool operator==(Position a, Position b){ return a.Equals(b); } public static bool operator!=(Position a, Position b){ return !(a==b); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值