JAVA——栈的基本用法

栈的基本用法

  • 一、基本介绍
    • 1.概念
    • 2.栈能用单链表实现吗?
  • 二、JAVA集合类对应的栈(Stack)
  • 三、自己实现栈的基本操作


一、基本介绍

1.概念

栈:(先进后出)

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

压栈:

栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:

栈的删除操作叫做出栈。出数据在栈顶。

JAVA——栈的基本用法_第1张图片

2.栈能用单链表实现吗?

单链表尾插法每次得找到末尾才能插入,不占优势。下面介绍的都由数组实现。

实现方式 入栈出栈时间复杂度
数组 O(1)
单链表 头插法 :O(1)尾插法:O(N)

二、JAVA集合类对应的栈(Stack)

向栈中存放元素:stack.push();
获取栈顶元素:stack.peek();
删除栈顶元素(返回值为删除的元素):stack.pop();

 public static void main2(String[] args) {
        Stack<Integer> stack = new Stack<>();//创建一个栈
       //向栈中存放1,2,3个元素
        stack.push(1);
        stack.push(2);
        stack.push(3);
        System.out.println(stack.peek());//获取栈顶元素 但是不删除 结果为3
        System.out.println(stack.pop());//弹出栈顶元素 删除  结果为3
        System.out.println(stack.peek());//获取栈顶元素 但是不删除 结果为2
        System.out.println(stack.empty());//判断栈中元素是否为空
        System.out.println(stack.isEmpty());//判断是否为空 

    }

三、自己实现栈的基本操作

1.开辟一个栈的空间
2.push往栈中存放元素要判断栈满没满,满了进行扩容,没满则存放到数组最后的位置。
3.pop删除栈顶元素要判断栈是否为空

public class MyStack {
    public int[] elem;//开辟一个栈的空间
    public int usedSize;//栈实际用的长度

    public MyStack() {
        this.elem = new int[10];//设置栈的空间为10个元素的空间
    }

//push往栈中存放元素要判断栈满没满
    public boolean isFull() {
        //数据个数==长度了
        if (this.usedSize == this.elem.length) {
            return true;
        }
        return false;
    }

    public void push(int item) {
        if (isFull()) {
            //满了进行扩容
            this.elem = Arrays.copyOf(this.elem, 2 * elem.length);
        }
        //没满,存放到数组最后的位置
        this.elem[this.usedSize] = item;
        this.usedSize++;
    }


    //pop删除栈顶元素要判断栈是否为空
    public boolean empty(){
        //数据个数为空的时候
        return this.usedSize==0;
    }

    public int pop() throws RuntimeException {
        if (empty()) {
            throw new RuntimeException("栈空了");
        }
        int val=this.elem[this.usedSize-1];
        this.usedSize--;
        return val;
    }

    //获取栈顶元素
    public int peek(){
        if(empty()){
            throw new RuntimeException("栈空了");
        }
        return this.elem[this.usedSize-1];
    }


    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        System.out.println(myStack.peek());//获取栈顶元素 但是不删除 结果为3
        System.out.println(myStack.pop());//弹出栈顶元素 删除  结果为3
        System.out.println(myStack.peek());//获取栈顶元素 但是不删除 结果为2
        System.out.println(myStack.empty());//结果为false
      System.out.println(myStack.pop());//2
        System.out.println(myStack.pop());//1
        System.out.println(myStack.pop());//证明为空报异常
    }
}

你可能感兴趣的:(java,开发语言,后端)