java中的栈Stack

在这里插入图片描述

1.概念

1.1栈

  • 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除操作。
  • 进行数据插入和删除操作的一端称为栈顶,另一端称为栈底
  • 栈中的元素遵循先进后出原则FILO(First In Last Out)。

1.2 进栈push

栈的插入操作称为进栈/压栈,数据在栈顶
如下图所示:
进栈操作

1.3 出栈 pop

栈的删除操作称为出栈
如下图所示:
出栈操作

1.4 注意区分此处的栈和JVM中的栈

  • 此处的栈是一种数据结构
  • JVM中的栈特指JVM中一端内存区域

2.栈的使用

2.1 Java标准库中提供的栈

在这里插入图片描述
可以看到,Stack继承了Vector。
在这里插入图片描述

在这里插入图片描述

2.1 实现的方法

在这里插入图片描述
下面详细介绍一下实现的方法含义:

Stack()构造一个空的栈
E push(E)将e入栈,并返回e
E pop()将栈顶元素出栈并返回
E peek()获取栈顶元素
int size()获取栈中有效元素个数(继承自Vector)
boolean empty()检查栈是否为空

java代码实现

public class stackTest {
    public static void main(String[] args) {
        Stack<Integer> stack=new Stack<>();

        //入栈
        stack.push(1);
        stack.push(2);
        stack.push(23);
        stack.push(65);
        stack.push(52);

        //获取栈顶元素
        System.out.println("栈顶元素:"+stack.peek());

        //获取栈中有效元素个数
        System.out.println("栈中有效元素个数:"+stack.size());

        //出栈
        stack.pop();

        //获取栈顶元素
        System.out.println("栈顶元素:"+stack.peek());

        //获取栈中有效元素个数
        System.out.println("栈中有效元素个数:"+stack.size());

        //检查栈是否为空
        System.out.println("栈是否为空:"+stack.empty());//false

        for (int i=0;i<=3;i++){
            stack.pop();
        }
        System.out.println("栈是否为空:"+stack.empty());//true

        stack.pop();//报错
    }
}

运行结果:
在这里插入图片描述

可以注意到,当栈为空时,再进行出栈操作时,会报错:EmptyStackException

3.模拟实现栈

栈是特殊的顺序表,可以用链表和数组的方式来实现,但是一般采用数组来实现

public class MyStack {

    /** 构造方法*/
    private int[] arr;

    //记录栈中元素个数
    private int size;

    public MyStack(int MaxSize) {
        this.arr = new int[MaxSize];
    }

    //无参构造函数,默认最大容量12
    public MyStack() {
        this(12);
    }



    /** 入栈 */
    public int push(int value){
        //栈满,需要扩容  扩容至原来的2倍
        if (this.size==arr.length){
            int[] copyArr;
            copyArr= Arrays.copyOf(arr,arr.length*2);
            arr=copyArr;
        }

        //栈未满
        //将元素添加到size位置
        this.arr[size]=value;
        //元素个数+1
        this.size=this.size+1;

        return value;
    }

    /** 判断元素是否为空 */
    public boolean isEmpty(){
        return this.size==0;
    }
    
    
    /** 出栈 */
    public int pop(){
        //栈空
        if(isEmpty()){
            //没有元素   抛出异常
            throw new RuntimeException("栈为空,不能出栈操作。。。");
        }
        
        //栈不为空
        //获取栈顶元素
        int value=this.arr[size-1];
        this.size--;
        return value;
    }
    
    /** 获取栈顶元素 */
    public int peek(){
        //栈空
        if(isEmpty()) {
            //没有元素   抛出异常
            throw new RuntimeException("栈为空,不能出栈操作。。。");
        }
        
        return this.arr[this.size-1];
    }
    
    /** 获取元素个数 */
    public int getSize(){
        return this.size;
    }
}

参考文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值