返回

栈的数据结构及算法

前端

栈概述

栈是一种数据结构,它遵循后入先出(FILO)的原则,也就是说,后放进去的东西会先拿出来。栈可以被看作是一个杯子,我们往杯子里放东西,先放进去的东西会在最下面,后放进去的东西会在最上面。当我们从杯子里拿东西的时候,我们会先拿到最上面的东西,然后是下面的东西,以此类推。

栈在计算机科学中有很多应用,比如:

  • 存储函数调用时的局部变量。当一个函数被调用时,它的局部变量会被压入栈中。当函数返回时,它的局部变量会被弹出栈。
  • 实现递归算法。递归算法是一种函数调用自身的方法。当一个函数调用自身时,它的参数会被压入栈中。当函数返回时,它的参数会被弹出栈。
  • 实现表达式求值。表达式求值器使用栈来存储操作数和运算符。当一个操作数被遇到时,它会被压入栈中。当一个运算符被遇到时,它会被弹出栈,并与栈顶的两个操作数进行运算。运算结果会被压入栈中。

栈的数据结构

栈可以由数组或链表来实现。数组实现的栈被称为顺序栈,链表实现的栈被称为链式栈。

顺序栈的优点是访问速度快,缺点是空间利用率不高。链式栈的优点是空间利用率高,缺点是访问速度慢。

栈的算法

栈有以下几种基本操作:

  • 压栈(push):将一个元素压入栈中。
  • 出栈(pop):将栈顶的元素弹出栈。
  • 取栈顶元素(top):获取栈顶的元素,但不弹出栈。
  • 判断栈是否为空(isEmpty):判断栈是否为空。

栈的应用

栈在计算机科学中有很多应用,比如:

  • 存储函数调用时的局部变量。
  • 实现递归算法。
  • 实现表达式求值。
  • 括号匹配。
  • 迷宫求解。
  • 编译器。

栈的示例代码

以下是用Java实现的栈的示例代码:

public class Stack {

    private int[] arr;
    private int top;

    public Stack(int size) {
        arr = new int[size];
        top = -1;
    }

    public void push(int value) {
        if (top == arr.length - 1) {
            System.out.println("Stack is full");
        } else {
            arr[++top] = value;
        }
    }

    public int pop() {
        if (top == -1) {
            System.out.println("Stack is empty");
            return -1;
        } else {
            return arr[top--];
        }
    }

    public int peek() {
        if (top == -1) {
            System.out.println("Stack is empty");
            return -1;
        } else {
            return arr[top];
        }
    }

    public boolean isEmpty() {
        return top == -1;
    }

    public static void main(String[] args) {
        Stack stack = new Stack(5);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);

        while (!stack.isEmpty()) {
            System.out.println(stack.pop());
        }
    }
}

结论

栈是一种遵循后入先出(FILO)原则的数据结构,它在计算机科学中有很多应用。栈可以由数组或链表来实现,数组实现的栈被称为顺序栈,链表实现的栈被称为链式栈。栈有以下几种基本操作:压栈、出栈、取栈顶元素、判断栈是否为空。