Unity中Stack用法以及删除Stack的方法
- 介绍
- Stack<T>的API
- Stack<T> 常用方法
- 创建和初始化 Stack<T>
- Push 和 Pop 操作
- Stack<T>遍历
- 清空栈
- 检查栈是否包含某个元素
- 栈的典型应用场景
- 撤销操作
- 深度优先搜索(DFS)
- 注意事项
- 总结
介绍
因为之前很少使用Stack这个表,然后在做对象池的时候用了一下然后发现我的对象有时候无法删除,然后这里我分享一下Stack的用法和删除方式。
Stack的API
Stack是先进后厨的集合类,在System.Collections.Generic命名空间中;
通常用在临时存储和特定顺序处理数据,比如撤销操作、递归算法、深度优先搜索等。
Stack 常用方法
Push(T item):将元素添加到栈顶。
Pop():移除并返回栈顶的元素。
Peek():返回栈顶的元素但不移除它。
Clear():清空栈中的所有元素。
Count:获取栈中元素的数量。
Contains(T item):检查栈中是否包含某个元素。
创建和初始化 Stack
// 创建一个 Stack<T>,T 是泛型类型,比如 int、string 或自定义类
Stack<int> stack = new Stack<int>();
// 添加元素到栈中
stack.Push(10);
stack.Push(20);
stack.Push(30);
// 输出栈中的元素数量
Debug.LogError("栈中元素数量: " + stack.Count); // 输出: 3
Push 和 Pop 操作
Push:将元素添加到栈顶
Pop:移除并返回栈顶的元素(如果栈为空会抛出异常)
Stack<string> stack = new Stack<string>();
// 添加元素
stack.Push("Apple");
stack.Push("Banana");
stack.Push("Cherry");
// 移除并返回栈顶元素
string topItem = stack.Pop();
Debug.LogError("移除的元素: " + topItem); // 输出: Cherry
// 查看栈顶元素(不移除)
string peekItem = stack.Peek();
Debug.LogError("栈顶元素: " + peekItem); // 输出: Banana
Stack遍历
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
stack.Push(3);
// 遍历栈
foreach (int item in stack)
{
Debug.LogError(item); // 输出顺序: 3, 2, 1
}
清空栈
使用 Clear() 方法可以清空栈中的所有元素。
stack.Clear();
Debug.LogError("栈中元素数量: " + stack.Count); // 输出: 0
注意:这里如果你T是GameObject对象的话需要额外的操作
Stack<GameObject> noteStack = new Stack<GameObject>();
while (noteStack.Count > 0)
{
GameObject note = noteStack.Pop();
//是 GameObject
Destroy(note);
}
stack.Clear();
Debug.LogError("栈中元素数量: " + stack.Count); // 输出: 0
检查栈是否包含某个元素
使用 Contains(T item) 方法可以检查栈中是否包含某个元素。
Stack<string> stack = new Stack<string>();
stack.Push("Apple");
stack.Push("Banana");
bool containsBanana = stack.Contains("Banana");
Debug.LogError("栈中是否包含 Banana: " + containsBanana); // 输出: True
栈的典型应用场景
撤销操作
Stack<string> actionStack = new Stack<string>();
// 用户执行操作
actionStack.Push("Typed 'Hello'");
actionStack.Push("Deleted 'Hello'");
// 撤销操作
string lastAction = actionStack.Pop();
Debug.LogError("撤销的操作: " + lastAction); // 输出: Deleted 'Hello'
深度优先搜索(DFS)
Stack<int> dfsStack = new Stack<int>();
dfsStack.Push(1); // 起始节点
while (dfsStack.Count > 0)
{
int currentNode = dfsStack.Pop();
Debug.LogError("访问节点: " + currentNode);
// 假设 currentNode 有子节点 2 和 3
dfsStack.Push(3);
dfsStack.Push(2);
}
注意事项
空栈异常:
如果栈为空时调用 Pop() 或 Peek(),会抛出 InvalidOperationException。因此,在使用这些方法前最好检查栈是否为空。
if (stack.Count > 0)
{
int item = stack.Pop();
}
性能:
Stack 的 Push 和 Pop 操作的时间复杂度为 O(1),非常适合需要快速添加和移除元素的场景
总结
感谢大家的支持!