1.链表
实现栈的四个基本功能 入栈 出栈 长度 栈顶值
public class 基础 : MonoBehaviour
{
public class MyStack
{
//定义每一个元素的数据结构
//下一个元素 和 该元素的值
public class StackData
{
public StackData next;
public object data;
public StackData(StackData next, object data)
{
this.next = next;
this.data = data;
}
}
//记录数量
int size;
//代表栈顶元素
StackData top;
public void Push(object data)
{
//因为栈是先进后出 后进来的元素就成为了栈顶
//所以每压入一个元素 就让后进来元素的next指向前一个元素
//出栈时 丢失最后节点的引用即可
top = new StackData(top, data);
size++;
}
public object Pop()
{
//弹出栈顶元素 同时下一个元素就是新栈顶
object result = top.data;
top = top.next;
size--;
return result;
}
public int Count
{
get
{
return size;
}
}
public object Peek()
{
if (top == null) return null;
return top.data;
}
}
private void Start()
{
MyStack ms = new MyStack();
ms.Push(1);
ms.Push(2);
ms.Push(3);
ms.Push(4);
ms.Push(5);
Debug.Log(ms.Pop());
Debug.Log(ms.Pop());
Debug.Log(ms.Count);
Debug.Log(ms.Peek());
}
}
2.数组
(1)数组就是会更麻烦一点 不过可以加深对数组和栈的理解
(2)Pop和Enlarge 核心就是数组满了以后 创建一个新数组 将旧书组中的元素放入新数组 然后再将新数组赋值给旧数组即可
(3)栈是先进后出 所以只需要着重处理数组的末尾索引即可
public class 基础 : MonoBehaviour
{
public class MyStack<T>
{
//通过数组实现堆栈
public T[] list;
public int maxSize = 2;
public int nowSize = 0;
public MyStack()
{
list = new T[maxSize];
}
public int Count
{
get
{
return nowSize;
}
}
public void Push(T data)
{
if(maxSize >= nowSize + 1)
{
list[nowSize++] = data;
}
else
{
Enlarge();
list[nowSize++] = data;
}
}
public T Pop()
{
if(nowSize > 0)
{
T[] list3 = new T[maxSize];
T temp = list[--nowSize];
for (int i = 0; i < list.Length - 1; i++)
{
list3[i] = list[i];
}
list = list3;
return temp;
}
else
{
return default(T);
}
}
public void Enlarge()
{
T[] list2 = new T[maxSize * 2];
for(int i = 0; i < list.Length; i++)
{
list2[i] = list[i];
}
list = list2;
maxSize *= 2;
}
}
private void Start()
{
MyStack<int> ms = new MyStack<int>();
ms.Push(1);
ms.Push(2);
ms.Push(3);
ms.Push(4);
ms.Push(5);
Debug.Log(ms.Pop());
Debug.Log(ms.Count);
}
}