数据结构之栈(java版)

栈和队列是两种不同的底层数据结构,两种数据结构都是线性结构但是却有本质本质上的区别。栈是一种先进后出的储存模式,比如:数据的入栈顺序是A、B、C、D、E、F,但是它的出栈顺序为F、E、D、C、B、A。而在队列中,数据的入栈顺序为A、B、C、D、E、F并且它的出队顺序也为A、B、C、D、E、F那么,我们也可以根据栈与队列的性质在数组的基础上做一个CURD。
下面便是我对栈的一些操作并且加上好理解的注释,我首先设计了一个接口,里面包含了对栈的操作

package stack;
//stack接口
public interface Stack<E> {
    void push(E e);
    void pop();
    E peek();
    int getSize();
    boolean isEmpty();
}

然后继承这个接口并进行操作:

package stack;


/**
 * 栈
 * 后进先出(Last In First Out ,简写为LIFO)的数据结构
 * 这是一个由数组封装的栈。
 * 一般栈有5个操作
 * void push(E) 入栈
 * void pop()  出栈
 * E peek()   查看栈顶元素
 * int getSize()  得到元素个数
 * boolean isEmpty() 是否为空
 * 在这个栈中,为了更好的体现面向对象的思想,我是定义了一个stack的接口的
 * 所以会有@Override注解,如果不需要可以把不用加入这个接口。
 */
public class ArrayStack<E> implements Stack<E>{
    private E [] array;
    private int size;
    public ArrayStack(int capacity){
          array =(E [])new Object[capacity];
          size = 0;
      }
    public ArrayStack(){
         this(10);
      }
      //入栈
    @Override
    public void push(E e) {
        if (size==array.length){
            resize(array.length*2);
        }
        array[size]=e;
        size++;
    }
    //出栈
    @Override
    public void pop() {
     if (size<=1){
            throw  new IllegalArgumentException("当前栈为空");
        }
        if (size==array.length/2){
            resize(array.length/4);
        }
        array[size-1]=null;
        size--;
    }

    @Override
    public E peek() {
       return array[size-1];
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size==0;
    }
    public int getCapacity(){
          return array.length;
    }
    public E get(int index){
        return array[index];
    }
    @Override
    public String toString(){
          StringBuilder res = new StringBuilder();
          res.append(String.format("Array: size = %d , capacity = %d\n",size,array.length));
          res.append("Stack: ");
          res.append("[");
          for (int i = 0;i<size ;i++ ){
              res.append(array[i]);
              if (i !=size-1){
                  res.append("  ");
              }

          }
          res.append("] top");
          return res.toString();
    }
    //扩容
    private void resize(int newCapacity) {
        E [] newData = (E [])new Object[newCapacity];
        for (int i= 0;i < size ;i++){
            newData[i] = array[i];
        }
       array=newData;
    }

    public static void main(String[] args) {
        ArrayStack<Integer> arrayStack=new ArrayStack<>();
        for (int i=0;i<7;i++){
            arrayStack.push(i);
            System.out.println(arrayStack);
        }
        System.out.println(arrayStack.peek());
        arrayStack.pop();
        System.out.println(arrayStack);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值