Java栈的实现

栈的定义

栈是限定仅在表的一端进行操作的线性表。 允许进行插入和删除元素操作的这一端称为栈顶,固定不变的另一端称为栈底。由于只能在栈顶进行插入和删除操作,所以栈中元素的最大特点就是 “先进后出”,即先入栈的元素在后面出栈。
栈分为顺序栈与链式栈。

在这里插入图片描述

栈的基本操作

  1. 栈初始化:生成一个空栈;
  2. 判断栈空与栈满:判断栈中元素是否为空或者满;
  3. 入栈:向栈中添加元素;
  4. 出栈:删除栈中元素;
  5. 读取栈顶元素:获取栈顶元素。

利用Java泛型实现顺序栈

//顺序栈
public class Mystack<T> {
    private T[] stack;//存放元素
    private int size;//记录栈的元素个数
    private final int DEFAULT_SIZE=10;//初始化默认大小为10

    public Mystack() {
        size = 0;
        stack = (T[]) new Object[DEFAULT_SIZE];
    }

    //判断栈是否为空
    public boolean isEmpty() {
        if (size <= 0)
            return true;
        else
            return false;
    }

    //判断栈是否已满
    public boolean isFull() {
        if (size >= stack.length)
            return true;
        else
            return false;
    }
    //入栈
    public void push(T value) {
        if (isFull())
            return;
        stack[size++] = value;
    }

    //出栈
    public void pop() {
        if (isEmpty())
            return;
        stack[size - 1] = null;
        size--;
    }

    //获取栈顶元素
    public T getTop() {
        return stack[size - 1];
    }

}

以下为测试代码:

 public static void main(String[] args){

        Mystack<Integer> mystack = new Mystack<>();
        System.out.println("栈是否为空" + mystack.isEmpty());
        mystack.push(1);
        mystack.push(2);
        mystack.push(3);
        System.out.println("栈顶元素为" + mystack.getTop());
        mystack.pop();
        System.out.println("出栈后栈顶元素为" + mystack.getTop());
        
    }

测试结果为:
在这里插入图片描述
链栈的实现

public class LinkStack<T> {
    //节点类
    static class Entry {
        private Object value;
        private Entry next;

        public Entry() {

        }

        public Entry(Object value) {
            this.value = value;
            next = null;
        }

        public Object getValue() {
            return value;
        }

        public void setValue(Object value) {
            this.value = value;
        }

        public Entry getNext() {
            return next;
        }

        public void setNext(Entry next) {
            this.next = next;
        }
    }

    private Entry head;//头节点
    private Entry tailflag;//尾节点

    public LinkStack() {
        head = new Entry();
        tailflag = head;
    }

    //尾部入栈
    public void pushtail(T value) {
        Entry newEntry = new Entry(value);
        tailflag.setNext(newEntry);
        tailflag = newEntry;
    }

    //尾部出栈
    public void poptail() {
        tailflag.setValue(null);
        Entry p = head;
        while (p.getNext() != tailflag) {
            p = p.getNext();
        }
        tailflag = p;
        p.setNext(null);
    }

    //头部入栈
    public void pushhead(T value) {
        Entry newEntry = new Entry(value);
        if (head.getNext() == null)
            head.setNext(newEntry);
        else {
            newEntry.setNext(head.getNext());
            head.setNext(newEntry);
        }
    }

    //头部出栈
    public void pophead() {
        if (head.getNext() == null)
            return;
        else {
            head.getNext().setValue(null);
            head.setNext(head.getNext().getNext());
        }
    }

    //获取头部元素
    public T getHead() {
        return (T) head.getNext().value;
    }

    //获取尾部元素
    public T getTail() {
        return (T) tailflag.value;
    }
}

以下为测试代码:

public static void main(String[] args) {
        LinkStack<Integer> mystack = new LinkStack<>();
        mystack.pushtail(1);
        mystack.pushtail(2);
        mystack.pushtail(3);
        System.out.println("尾部元素为"+mystack.getTail());
        System.out.println("头部元素为"+mystack.getHead());
        mystack.pushhead(4);
        mystack.pushhead(5);
        mystack.pushhead(6);
        System.out.println("尾部元素为"+mystack.getTail());
        System.out.println("头部元素为"+mystack.getHead());
    }

测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值