03-栈

nobility 发布于 2021-03-29 01-数据结构 1960 次阅读


  • 栈对应的操作,属于是数组的子集,因为添加元素和取出元素只能同一端,也就是栈顶
  • 栈是一种后进先出的数据结构(LIFO),用户无法获取中间的元素
  • 比如撤销操作、函数调用栈和代码编辑器的括号匹配等都用到了栈结构
  • 由于栈的实现方式不仅是一种,所以写成接口的形式,方便多种实现
/**
 * @InterfaceName: Stack
 * @Description: 自定义栈接口
 */
public interface Stack<E> {
  /**
   * @MethodName: push
   * @Description: 将元素压入栈顶
   * @Param element: 入栈元素
   * @Return void
   */
  Void push (E element);

  /**
   * @MethodName: pop
   * @Description: 将栈顶元素从栈顶弹出
   * @Return E
   */
  E pop ();
  /**
   * @MethodName: peek 
   * @Description: 返回栈顶元素
   * @Return E
   */
  E peek ();
  
  /**
   * @MethodName: getSize 
   * @Description: 获取栈中的元素个数
   * @Return int
   */
  Int getSize ();

  /**
   * @MethodName: isEmpty 
   * @Description: 判断栈是否为空
   * @Return boolean
   */
  Boolean isEmpty ();
}

基于数组实现的栈

/**
 * @ClassName: ArrayStack
 * @Description: 基于自定义动态数组实现的自定义栈
 */
public class ArrayStack<E> implements Stack<E> {
  private Array<E> array;

  /**
   * @MethodName: ArrayStack
   * @Description: 根据用户需求创建指定大小容量的栈
   * @Param capacity: 用户指定的容量
   */
  Public ArrayStack (int capacity) {
    this. Array = new Array<>(capacity);
  }

  /**
   * @MethodName: ArrayStack
   * @Description: 为用户设置默认的容量大小,为 10
   */
  Public ArrayStack () {
    this. Array = new Array<>(10);
  }

  /**
   * @MethodName: push
   * @Description: 入栈操作实现
   * @Param element: 入栈元素
   * @Return void
   */
  @Override
  Public void push (E element) {
    This.Array.Add (this.GetSize (), element); //直接向数组最后添加元素即可
  }

  /**
   * @MethodName: pop
   * @Description: 出栈操作实现
   * @Return E
   */
  @Override
  Public E pop () {
    Return this.Array.Remove (this.GetSize () - 1); //直接将数组最后的元素删除并返回即可
  }

  /**
   * @MethodName: peek
   * @Description: 查看栈顶元素操作实现
   * @Return E
   */
  @Override
  Public E peek () {
    Return this.Array.Get (this.GetSize () - 1);  //返回数组最后一个元素
  }

  /**
   * @MethodName: getSize
   * @Description: 查看栈中元素个数操作实现
   * @Return int
   */
  @Override
  Public int getSize () {
    Return this.Array.GetSize (); //返回当前数组中元素的个数
  }

  /**
   * @MethodName: isEmpty
   * @Description: 查看栈是否为空操作实现
   * @Return boolean
   */
  @Override
  Public boolean isEmpty () {
    Return this.Array.IsEmpty ();  //返回当前数组是否为空
  }

  @Override
  Public String toString () {
    StringBuilder sb = new StringBuilder ();
    For (int i = 0; i < this.Array.GetSize (); i++) {
      Sb.Append (array.Get (i));
      If (i != this.Array.GetSize () - 1) {
        Sb.Append (",");
      }
    }
    Return "ArrayStack{" +
        "Stack=[" + sb.ToString () +
        "] top}";
  }
}

基于单向链表实现的栈

/**
 * @ClassName: LinkedListStack
 * @Description: 基于自定义单向链表实现的自定义栈
 */
public class LinkedListStack<E> implements Stack<E> {
  private LinkedList<E> list;

  /**
   * @MethodName: ArrayStack
   * @Description: 创建栈
   */
  Public LinkedListStack () {
    this. List = new LinkedList<>();
  }
  /**
   * @MethodName: push 
   * @Description: 入栈操作实现
   * @Param element: 入栈元素
   * @Return void
   */
  @Override
  Public void push (E element) {
    This.List.Add (0, element);  //直接向链表头部添加元素接即可
  }
  
  /**
   * @MethodName: pop 
   * @Description: 出栈操作实现
   * @Return E
   */
  @Override
  Public E pop () {
    Return this.List.Remove (0); //直接将链表头部元素删除并返回即可
  }

  /**
   * @MethodName: peek 
   * @Description: 查看栈顶元素操作实现
   * @Return E
   */
  @Override
  Public E peek () {
    Return this.List.Get (0);  //返回链表的第一个元素即可
  }
  
  /**
   * @MethodName: getSize 
   * @Description: 查看栈中元素个数操作实现
   * @Return int
   */
  @Override
  Public int getSize () {
    Return this.List.GetSize (); //返回当前链表中的元素个数
  }
  
  /**
   * @MethodName: isEmpty 
   * @Description: 查看栈是否为空操作实现
   * @Return boolean
   */
  @Override
  Public boolean isEmpty () {
    Return this.List.IsEmpty (); //返回当前链表是否为空
  }

  @Override
  Public String toString () {
    StringBuilder sb = new StringBuilder ();
    For (int i = this.List.GetSize () - 1; i >= 0; i--) {
      Sb.Append (list.Get (i));
      If (i != 0) {
        Sb.Append (",");
      }
    }
    Return "LinkedListStack{" +
        "Stack=[" + sb +
        "] top }";
  }
}
加油啊!即便没有转生到异世界,也要拿出真本事!!!\(`Δ’)/
最后更新于 2021-03-29