数据结构之栈

一、栈的概念跟使用场景

栈是一种先进后出的有序列表数据结构,插入和删除元素只能在该线性表的同一端进行,也就是栈顶。

栈的使用场景:

函数调用时,在操作系统里,会给每一个线程分配一块自己的内存区域,这种内存区域就是栈这一种结构,用来存储函数在调用时候的一些临时变量等等。

举个例子,假设有三个方法,分别为A、B、C,A方法中调用了B,B方法中调用了C在主函数中调用了A方法。

首先main函数启动,系统为其分配一个栈帧,由于main函数调用了A方法,系统为A方法分配一个新的栈帧,并压入栈顶。A方法调用了B方法,系统为B方法分配一个新的栈帧,并压入栈顶。而B方法调用了C方法,系统为C方法分配一个新的栈帧,并压入栈顶。C方法被执行完毕后,其栈帧被弹出栈顶,释放内存。接着B方法被执行完毕后,其栈帧被弹出栈顶,释放内存。然后A方法被执行完毕后,其栈帧被弹出栈顶,释放内存。最后main 函数执行完毕,其栈帧被弹出栈顶,程序结束。

二、顺序栈的实现

首先我们要实现栈的初始化:

class ListStack{
    //栈容量
    private int maxSize;
    //栈顶的位置 默认为0
    private int top = 0;
    //存储栈数据的数组
    private int[] stack;
    //构造方法初始化
    public ListStack(int maxSize){
        this.maxSize=maxSize;
        stack = new int[maxSize];
    }
}

判断栈满的方法:

public boolean isFull(){
        return top==maxSize;
    }

判断栈空的方法:

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

入栈的方法:

public void push(int data){
        if(isFull()){
            throw new RuntimeException("栈满 无法入栈");
        }else {
        stack[top]=data;
        top++;
        }
    }

出栈的方法:

 public int pop(){
        if(isEmpty()){
            throw new RuntimeException("栈空 无法出栈");
        }else {
            return stack[--top];
        }
    }

遍历栈的方法:

 public void showData(){
        for (int i=0;i

返回栈顶的元素:

public int peekStack(){
        return stack[--top];
    }

对于队列与栈这两种数据结构的时间复杂度,它们的时间复杂度都是O(1)。

你可能感兴趣的:(数据结构与算法,数据结构,java,算法)