栈:是一种先进后出的线性表,只能在栈顶(表尾)进行插入删除操作。
数组栈
通过下面代码可以看出来,栈只是用了动态数组的其中几个方法,只能在尾部进行添加删除操作,是功能受限一种数组结构。所以只能在栈顶进栈顶出。
namespace DataStructure { /// <summary> /// 定义一个栈接口, /// </summary> /// <typeparam name="E"></typeparam> interface IStack<E> { int Count { get; } bool IsEmpty { get; } void Push(E e); E Pop(); E Peek(); } /// <summary> /// 数组栈 /// </summary> /// <typeparam name="E"></typeparam> class ArrayIStack<E> : IStack<E> { //存入的一个数组 private MyArray<E> arr; /// <summary> /// 创建指定长度的数组 /// </summary> /// <param name="capacity"></param> public ArrayIStack(int capacity) { arr = new MyArray<E>(capacity); } /// <summary> /// 创建默认长度的数组 /// </summary> /// public ArrayIStack() { arr = new MyArray<E>(); } public int Count { get { return arr.Count; } } public bool IsEmpty { get { return arr.IsNull; } } /// <summary> /// 获取尾部的元素 /// </summary> /// <returns></returns> public E Peek() { return arr.GetLast(); } public E Pop() { return arr.RemoveLast(); } /// <summary> /// 添加元素:因为数组只有在尾部添加元素,耗费时间最少 /// 所以将元素从尾部添加 /// </summary> /// <param name="e"></param> public void Push(E e) { arr.AddLast(e); } } }
链表栈
#region 链表栈 class LinkedListIStack<E> : IStack<E> { /// <summary> /// 当前链表 /// </summary> private MyLinkedList<E> list; public LinkedListIStack() { list = new MyLinkedList<E>(); } public int Count { get { return list.Count; } } public bool IsEmpty { get { return list.IsEmpty; } } /// <summary> /// 获取栈顶元素() /// 和数组不同的是,单链表获取表头元素时最快,所以这里使用链表中获取头部元素的方法 /// </summary> /// <returns></returns> public E Peek() { return list.GetFirst(); } /// <summary> /// 出栈操作 /// </summary> /// <returns></returns> public E Pop() { return list.RemoveFirst(); } public void Push(E e) { list.AddFirst(e); } } #endregion
从上面的代码我们可以分析出,不管是数组栈还是链表栈,这几个方法都是最优的。