Java栈的两种实现方式

用数组和链表两种方式来实现了栈
首先来看用数组实现的,比较简单

import java.util.Arrays;

/*
 * 用数组来实现一个栈
 * 栈:后进先出
 * 主要有push pop peek isEmpty 
 * peek 负责获取栈顶元素 在数组的实现中 peek负责获取最新存放在数组中的元素 stack[size-1]
 * 这样在pop取出元素的时候直接获取peek()的值就好
 * push往数组中存放元素的时候 直接将size+1 并且将这个元素放在stack[size++]的位置
 * 最后要注意数组的容量 在向数组中放元素的时候不要超过初始化的定义
 */
public class Stack<E> {
    int size;//数组中存储元素的个数
    private Object[] stack;
    public Stack(){
        stack=new Object[10];
    }

    public Boolean isEmpty(){

    return size==0;

    }

    @SuppressWarnings("unchecked")
    public E peek(){
        if(isEmpty()){
            return null;
        }
        return (E) stack[size-1];
    }

    public E push(E item){
        stack[size++]=item;
        return item;
    }


    public E pop(){
        ensureCapacity(size+1);//往数组中添加元素的时候 先进行容量检测 如果已经放满了 那么就再+10个容量
      E e= peek();
      stack[size-1]=null;
      size--;
      return e; 
    }

    public void ensureCapacity(int size){
        int len =stack.length;
        if (len>size){
            int newLen=10;
            stack=Arrays.copyOf(stack,newLen);
        }

    }


    public static void main(String[] args){
        Stack<Integer> s=new Stack<>();
        s.push(56);
        s.push(6785);
        s.push(342);
        System.out.println(s.size);
        System.out.println("栈顶元素为"+s.pop());// 打印 342
        System.out.println("栈顶元素为"+s.pop());//打印 6785
    }
}

接着是用链表的方式来实现栈,代码如下:

/*
 * 用链表来实现栈
 */

class  Node<E>{
    Node<E>next=null;
    E data;
    public Node(E data){this.data=data;}
}
public class LinkedStack<E> {

    Node<E>top=null;    //头结点设置为空

    public boolean isEmpty(){
        return top==null;
    }

    /*
     * push时候相当于new一个头结点 让新的结点指向单链表的头结点
     * 以新结点作为单链表的头结点即可
     */

    public void push(E data){
        Node<E>newNode=new Node<E>(data);
        newNode.next=top;//将现在栈顶的元素的值放在第二个
        top=newNode;    //新的栈顶元素的值放在top中
    }

    /*
     * pop时候将链表的头结点指向next 将next作为新的头结点即可
     */

    public E pop(){
        if(this.isEmpty()){
            return null;
        }

        E data= top.data;
        top=top.next;
        return data;
    }

    public E peek(){
        if(this.isEmpty()){
            return null;
        }
        E data=top.data;
        return data;
    }//peek和pop的思路很相似 都是返回top元素 在pop完元素之后还需要将下一个top指针指到top上


    public static void main(String [] args){
        LinkedStack<Integer> stack=new LinkedStack<>();
        stack.push(22);
        stack.push(23);
        stack.push(24);
        stack.pop();
        System.out.print(stack.peek());//输出:  23

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值