数据结构-栈| 8月更文挑战

166 阅读2分钟

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。
这一端被称为栈顶,相对地,把另一端称为栈底。
向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

image.png

特征

一种遵从后进先出(LIFO)原则的有序集合,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作

手撸代码

入栈

空栈时,顶针top为-1,入栈时则需要先移动顶针top,再进行入栈操作
public void push(int x) {
    if (this.isFull()) {
        System.out.println("栈满了!");
        return;
    }
    this.stack[++this.top] = x;
    System.out.println("【" + x + "】进入栈!");
}

出栈

出栈时,则需要先拿出栈顶数据再进行移动顶针top
public void pop() {
    if (this.isEmpty()) {
        System.out.println("栈已空!");
        return;
    }
    System.out.println( "已出栈:【" + this.stack[this.top--] +"】");
}

完整例子

public class NewStack {
    // 栈顶指针
    private int top = -1;
    // 栈容量
    private int size = 0;
    // 栈
    private int[] stack;
    public NewStack(int length) {
        this.stack = new int[length];
        this.size = length;
    }
    /**
     * 栈是否为空
     */
    public boolean isEmpty() {
        return this.top == -1;
    }
    /**
     * 栈是否已满
     */
    public boolean isFull() {
        return this.top == this.size - 1;
    }
    /**
     * 入栈
     */
    public void push(int x) {
        if (this.isFull()) {
            System.out.println("栈满了!");
            return;
        }
        this.stack[++this.top] = x;
        System.out.println("【" + x + "】进入栈!");
    }
    /**
     * 出栈
     */
    public void pop() {
        if (this.isEmpty()) {
            System.out.println("栈已空!");
            return;
        }
        System.out.println( "已出栈:【" + this.stack[this.top--] +"】");
    }
    /**
     * 打印
     */
    public void showQueue() {
        System.out.print("打印栈!栈顶:");
        for (int i = this.top; i >= 0; i--) {
            System.out.print(this.stack[i] + " ");
        }
        System.out.println();
    }
    public static void main(String[] args) {
        NewStack newStack = new NewStack(6);
        int x = 6;
        while (x>0) {
            newStack.push(x%2);
            x = x/2;
        }
        newStack.showQueue(); // 打印栈!栈顶:1 1 0 
    }
}

总结

上面的例子用的是十进制转二进制来演示的
将十进制N每次取余的值放入栈低
N每次除于2的值进行下次循环
直到N为0截止
再将结果从栈中获取出来得到二进制的值

适用场景

  1. 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,回到原来的程序中
  2. 处理递归调用:只是除了存储下一个指令的地址外,也将参数、区域变量等数据存入堆栈。
  3. 表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)
  4. 二叉树的遍历
  5. 图的深度优先搜素法