栈的定义
栈(Stack)是限定仅在表尾进行插入和删除的线性表。允许插入和删除的一端称为栈顶(Top),另一端成为栈底(Bottom),不含任何数据元素的栈称为空栈。栈又成为后进先出的(Last In First Out)的线性表,简称LIFO结构。
- 栈的插入操作叫做进栈,也称压栈,入栈
- 栈的删除操作叫做出栈,也称弹栈
我们可以将栈结构想象为手枪弹夹,当我们给弹夹上子弹的时候,最先压入弹夹的子弹会在弹夹的最底部,最后压入弹夹的子弹会在最上面,当开枪发射子弹时,最后上的子弹(也就是最上面的子弹)会最先发射出去。
代码实现
- 定义栈节点类
public class StackNode<T>
{
public StackNode<T> next; // 下一个节点的引用
public T value; // 存储的数据
public StackNode(T value){
this.value = value;
}
}
- 栈的具体实现
public class MyStack<T>
{
private StackNode<T> m_Top = null; // 栈顶节点引用
private int m_Count = 0; // 记录栈中元素个数
public MyStack()
{
}
/// <summary>
/// 入栈
/// </summary>
/// <param name="value"></param>
public void Push(T value){
if(m_Top == null){
m_Top = new StackNode<T>(value);
}else{
StackNode<T> node = new StackNode<T>(value);
node.next = m_Top;
m_Top = node;
}
m_Count++;
}
/// <summary>
/// 出栈
/// </summary>
/// <returns></returns>
public T Pop(){
if(m_Top == null) return default(T);
StackNode<T> node = m_Top;
m_Top = m_Top.next;
m_Count--;
return node.value;
}
/// <summary>
/// 获取栈顶元素
/// </summary>
/// <returns></returns>
public T Peek(){
if(m_Top == null) return default(T);
return m_Top.value;
}
/// <summary>
/// 栈中元素个数
/// </summary>
/// <returns></returns>
public int Count(){
return m_Count;
}
/// <summary>
/// 是否为空栈
/// </summary>
/// <returns></returns>
public bool IsEmpty(){
return m_Top == null;
}
/// <summary>
/// 清空栈
/// </summary>
public void Clear(){
m_Top = null;
m_Count = 0;
}
}
测试
public static void Main(string[] args)
{
MyStack<int> stack = new MyStack<int>();
stack.Push(100);
stack.Push(200);
//stack.Clear();
Console.WriteLine(stack.Peek());
stack.Pop();
Console.WriteLine(stack.Peek());
Console.WriteLine(stack.Count());
Console.ReadKey(true);
}