栈(Stack)是限制只能在表的一端进行插入和删除操作的线性表。特点是后进先出(LIFO,Last In, First Out)。

这一点微软小冰都知道。

那么生活中有哪些栈的例子呢?

不知道大家有没有用枪的时候注意过弹夹的设计没有,弹夹的结构就符合栈的特点,入栈(塞子弹),出栈(发射子弹),最先放进去的子弹一定是最后一个打出去的,弹夹就是一个栈的结构。

栈里的每一个元素称为一个frame,最上层的称为top frame。 栈只支持三种操作: pop, top, push pop, 取出最上层的元素,叫做出栈,又叫弹栈。 top,查看最上层元素,只是看看,不取出来。 push,将新元素放在栈的最上层,叫做入栈,又叫压栈。

然后就没有其他操作了,如果想要把第三层的元素取出来,就必需进行三次出栈操作。 就好比必须打三枪才能把第三颗子弹打出来。

代码实现 新建一个StackArray类(名字当然是自定义的) 里面需要三个属性,分别是栈数组array,栈顶指针top,栈容量size。

用构造函数初始化栈数组。

public class StackArray {
    private int[] array;
    private int top;
    private int size;
    public StackArray(int size){
        array = new int[size];
        this.size = size;
        top = -1;
    }
}

压栈方法push()

// 压栈
public void push(int element){
    if(top == size-1){
        System.out.println("栈满了");
        return;
        }

    array[++top] = element;
}

弹栈方法pop()

// 弹栈
public Integer pop(){
    if(top == -1){
        System.out.println("栈空了");
        return null;
        }

    return array[top--];
}

查看栈顶元素peek()

// 查看栈顶
public void peek(){
    if(top == -1){
        System.out.println("栈空了");
        return;
        }

    System.out.println("栈顶元素为: "+array[top]);
}

测试一下吧~

public static void main(String[] args){
    StackArray stack = new StackArray(100);

    System.out.println("\n入栈 1 2 3 4 5");
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);
    stack.push(5);

    System.out.println("查看栈顶元素");
    stack.peek();

    System.out.println("\n出栈");
    System.out.println("出栈元素为:"+ stack.pop());
    System.out.println("出栈元素为:"+ stack.pop());

    System.out.println("\n查看栈顶元素");
    stack.peek();
}

输出结果

入栈 1 2 3 4 5
查看栈顶元素
栈顶元素为: 5

出栈
出栈元素为:5
出栈元素为:4

查看栈顶元素
栈顶元素为: 3

完整代码

public class StackArray {
    private int[] array;
    private int top;
    private int size;
    public StackArray(int size){
        array = new int[size];
        this.size = size;
        top = -1;
    }

    // 压栈
    public void push(int element){
        if(top == size-1){
            System.out.println("栈满了");
            return;
            }

        array[++top] = element;
    }

    // 弹栈
    public Integer pop(){
        if(top == -1){
            System.out.println("栈空了");
            return null;
            }

        return array[top--];
    }

    // 查看栈顶
    public void peek(){
        if(top == -1){
            System.out.println("栈空了");
            return;
            }

        System.out.println("栈顶元素为: "+array[top]);
    }

    public static void main(String[] args){
        StackArray stack = new StackArray(100);

        System.out.println("\n入栈 1 2 3 4 5");
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);

        System.out.println("查看栈顶元素");
        stack.peek();

        System.out.println("\n出栈");
        System.out.println("出栈元素为:"+ stack.pop());
        System.out.println("出栈元素为:"+ stack.pop());

        System.out.println("\n查看栈顶元素");
        stack.peek();
    }

}

数据结构:栈(数组实现)

Apr.09 2018
CATT-L
栈(Stack)是限制只能在表的一端进行插入和删除操作的线性表。特点是后进先出(LIFO,Last In, First Out)。
关于页面
返回