最近有老铁跟我讲自己对数据结构不熟悉,而且市面上一些学习资料比较难理解,让我给他讲一下数据结构,我考虑了一下,决定在接下来的日子,开启一个新的工程,用我们熟悉的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写的兄弟,可以给我留言