动态数组-----栈的实现

栈的定义

栈是限定仅在表尾进行插入和删除操作的线性表

  • 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)
  • 不含任何数据元素的栈称为空栈
  • 栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构
  • 栈本身是一个线性表,其数据元素具有线性关系,只不过它是一种特殊的线性表而已
  • 栈的插入操作,叫做进栈,也称压栈、入栈
  • 栈的删除操作,叫做出栈,也称弹栈

Stack栈接口的定义

同样栈可以顺序存储实现也可以链表存储实现
所以将共性抽取定义出Stack接口

public interface Stack<E> extends Iterable<E> {
    public int size();
    public boolean isEmpty();
    public void push(E element);
    public E pop();
    public E peek();
    public void clear();
}

ArrayStack类

该类为栈的顺序存储具体实现
因为栈本身就是一种特殊的线性表
所以我们可以借助之前完成的ArrarList来实现我们的ArrayStack
在这里插入图片描述

import shujujiegou_interface.Stack;

import java.util.Iterator;

public class ArrayStack<E> implements Stack<E> {

    //栈内部就是由一个线性表来实现
    private ArrayList<E> list;

    //创建一个默认容量的栈(默认容量的线性表)
    public ArrayStack(){
        list=new ArrayList<>();
    }

    //创建一个指定容量的栈(指定容量的线性表)
    public ArrayStack(int capacity){
        list=new ArrayList<>(capacity);
    }

    //获取栈中有效元素个数
    @Override
    public int size() {
        return list.size();
    }

    //判断栈是否为空
    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }

    //入栈一个元素
    @Override
    public void push(E element) {
        list.add(element);
    }

    //出栈一个元素并返回
    @Override
    public E pop() {
        return list.remove(list.size()-1);
    }

    //查看栈顶元素 不删除
    @Override
    public E peek() {
        return list.get(list.size()-1);
    }

    //清空栈
    @Override
    public void clear() {
        list.clear();
    }

    @Override
    public Iterator<E> iterator() {
        return list.iterator();
    }

    @Override
    public String toString() {
        StringBuilder sb=new StringBuilder(String.format("ArrayStack:%d/%d[",size(),list.getCapacity()));
        if (isEmpty()){
            sb.append("]");//ArrayStack:0/10[]
        }else {//ArrayStack:5/10[1,2,3,4,5]
            for (int i=0;i<size();i++){
                sb.append(list.get(i));
                if(i!=size()-1){
                    sb.append(",");
                }else{
                    sb.append("]");
                }
            }
        }
        return sb.toString();
    }
}

测试类

import shixianClass.ArrayStack;
import shujujiegou_interface.Stack;

public class TestArrayStack {
    public static void main(String[] args) {
        ArrayStack<Integer> stack=new ArrayStack<Integer>();
        System.out.println(stack);
        for(int i=1;i<=12;i++){
            stack.push(i);
        }
        System.out.println(stack);
        for(int i=1;i<=12;i++){
            System.out.print(stack.pop()+" ");
        }
        System.out.println(stack);
        for(int num:stack){
            System.out.println(num);
        }
    }
}

执行结果

ArrayStack:0/10[]
ArrayStack:12/20[1,2,3,4,5,6,7,8,9,10,11,12]
12 11 10 9 8 7 6 5 4 3 2 1 ArrayStack:0/5[]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章