下压堆栈的两种实现

算法第四版学习笔记一(下压堆栈的实现)

使用数组和链表两种实现方式
数组实现方式:

package ren.laughing.algorithms;

import java.util.Iterator;

/**
 * 下压堆栈(数组实现)
 * 
 * @author Laughing_Lz
 * @createTime 2018年9月2日
 * @param <E>
 */
public class ResizingArrayStack<E> implements Iterable<E> {

  private E[] items = (E[]) new Object[1];
  private int N = 0;

  public boolean isEmpty() {
    return N == 0;
  }

  public int size() {
    return N;
  }

  /**
   * 动态调整数组大小 保持数组大小与栈大小之比小于一个常数
   * 
   * @param max 调整后的数组长度
   */
  public void resize(int max) {
    E[] temp = (E[]) new Object[max];
    for (int i = 0; i < N; i++) {
      temp[i] = items[i];
    }
    items = temp;
  }

  public void push(E item) {
    if (N == items.length) {
      resize(2 * items.length);
    }
    items[N++] = item;
  }

  public E pop() {
    E item = items[--N];
    // 避免对象游离
    items[N] = null;
    if (N > 0 && N == items.length / 4) {
      resize(items.length / 2);
    }
    return item;
  }

  /**
   * 实现foreach遍历
   */
  @Override
  public Iterator<E> iterator() {
    return new StackIterator();
  }

  private class StackIterator implements Iterator<E> {
    private int i = N;

    @Override
    public boolean hasNext() {
      return i > 0;
    }

    @Override
    public E next() {
      return items[--i];
    }

  }
}

复制代码

链表实现方式:

package ren.laughing.algorithms;

import java.util.Iterator;

/**
 * 下压堆栈(链表实现)
 * 
 * @author Laughing_Lz
 * @createTime 2018年9月2日
 * @param <E>
 */
public class Stack<E> implements Iterable<E> {

  private Node first;
  private int N;

  private class Node {
    E item;
    Node next;
  }

  public boolean isEmpty() {
    return N == 0;
  }

  public int size() {
    return N;
  }

  public void push(E item) {
    Node oldfirst = first;
    first = new Node();
    first.item = item;
    first.next = oldfirst;
    N++;
  }

  public E pop() {
    E item = first.item;
    first = first.next;
    N--;
    return item;
  }

  /**
   * 实现foreach遍历
   */
  @Override
  public Iterator<E> iterator() {
    return new StackIterator();
  }

  private class StackIterator implements Iterator<E> {

    private Node current = first;

    @Override
    public boolean hasNext() {
      return first != null;
    }

    @Override
    public E next() {
      E item = current.item;
      current = first.next;
      return item;
    }

  }
}

复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值