第04篇栈

相关实战

一、简单介绍

  1. 栈是一种后入先出的有序列表,是一种线性数据结构;
  2. 栈只允许在一端进行插入和删除,这一端叫做栈顶,另外一端叫做栈底;

二、应用场景

  1. 子程序的调用:在跳往子程序前,会将下个指令的地址压入到栈中,当子程序处理完之后,再从栈中将指令取出来。
  2. 二叉树的遍历;
  3. 表达式的求值等等;

三、数组实现栈

(一)思路分析

一直保证从数组的最后一个元素加入或者删除即可。

(二)代码实现

package com.firewolf.javabase.s004;

/**
 * 使用数组来实现栈结构
 */
public class ArrayStack {

  /**
   * 默认容量为10
   */
  private static final Integer DEFAULT_CAPICITY = 10;
  /**
   * 队列容量
   */
  private int capacity;

  /**
   * 存放数据的容器
   */
  private Object[] data;

  /**
   * 当前大小
   */
  private int size;


  public ArrayStack(int capacity) {
    this.capacity = capacity;
    data = new Object[capacity];
  }

  public ArrayStack() {
    this(DEFAULT_CAPICITY);
  }

  /**
   * 添加元素
   *
   * @param el 要被添加的元素
   * @return 添加成功返回true,否则false
   */
  public boolean push(Object el) {
    if (full()) {
      return false;
    }
    data[size++] = el;
    return true;
  }

  /**
   * 弹出栈顶数据
   */
  public Object pop() {
    if (empty()) {
      return null;
    }
    return data[--size];
  }

  /**
   * 查看栈顶元素,只查看不弹出
   */
  public Object peek() {
    if (empty()) {
      return null;
    }
    return data[size - 1];
  }

  /**
   * 显示所有元素,其实不应该有这种方法
   */
  public void showAll() {
    for (int i = 0; i < size; i++) {
      System.out.print(data[i] + " ");
    }
    System.out.println();
  }


  /**
   * 栈是否满了
   */
  public boolean full() {
    return size == capacity;
  }

  /**
   * 栈是否为空
   */
  public boolean empty() {
    return size == 0;
  }

  public Integer size() {
    return size;
  }

}

四、链表实现栈

(一)思路分析

通过addLast和removeLast来添加或者删除最后一个元素即可;

(二)代码

package com.firewolf.javabase.s004;

import java.util.LinkedList;
import lombok.extern.slf4j.Slf4j;

/**
 * 使用链表来实现栈结构
 */
@Slf4j
public class LinkedListStack<T> {

  /**
   * 数据容器
   */
  private LinkedList<T> data;

  /**
   * 默认容量为10
   */
  private static final Integer DEFAULT_CAPICITY = 10;
  /**
   * 队列容量
   */
  private int capacity;


  /**
   * 当前大小
   */
  private int size;

  public LinkedListStack(int capacity) {
    this.capacity = capacity;
    data = new LinkedList<T>();
  }

  public LinkedListStack() {
    this(DEFAULT_CAPICITY);
  }


  /**
   * 添加元素
   *
   * @param el 要被添加的元素
   * @return 添加成功返回true,否则false
   */
  public boolean push(T el) {
    if (full()) {
      return false;
    }
    data.addLast(el);
    size++;
    return true;
  }

  /**
   * 弹出栈顶数据
   */
  public T pop() {
    if (empty()) {
      return null;
    }

    T t = data.removeLast();
    size--;
    return t;
  }

  /**
   * 查看栈顶元素,只查看不弹出
   */
  public Object peek() {
    if (empty()) {
      return null;
    }
    return data.peekLast();
  }

  /**
   * 显示所有元素,其实不应该有这种方法
   */
  public void showAll() {
    for (int i = 0; i < data.size(); i++) {
      System.out.print(data.get(i)+" ");
    }
    System.out.println();
  }


  /**
   * 栈是否满了
   */
  public boolean full() {
    return size == capacity;
  }

  /**
   * 栈是否为空
   */
  public boolean empty() {
    return size == 0;
  }

  public Integer size() {
    return size;
  }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值