📜  堆栈 (1)

📅  最后修改于: 2023-12-03 15:23:41.283000             🧑  作者: Mango

堆栈(Stack)

堆栈(Stack)是一种数据结构,它具有LIFO(Last In First Out)的特点,即后进先出。它的基本操作包括:入栈(push)和出栈(pop)。

栈的实现方式

栈的实现可以有两种方式:数组实现和链表实现。

数组实现

数组实现的栈,可以用一维数组来存储。数组中的第一个元素被称为栈底,最后一个元素被称为栈顶。当一个元素被压入栈时,它被放置在栈顶位置;当一个元素被弹出栈时,它从栈顶位置移除。

下面是Java语言实现数组栈的代码:

public class ArrayStack {
    private int[] array;
    private int top;
    private int capacity;

    public ArrayStack(int capacity) {
        this.capacity = capacity;
        this.array = new int[capacity];
        this.top = -1;
    }

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

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

    public void push(int item) {
        if (isFull()) {
            throw new RuntimeException("Stack is full!");
        }
        array[++top] = item;
    }

    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("Stack is empty!");
        }
        return array[top--];
    }

    public int peek() {
        if (isEmpty()) {
            throw new RuntimeException("Stack is empty!");
        }
        return array[top];
    }
}
链表实现

链表实现的栈,可以用单向链表来存储。链表中的第一个节点被称为栈顶,最后一个节点被称为栈底。当一个元素被压入栈时,它被放置在栈顶位置;当一个元素被弹出栈时,它从栈顶位置移除。

下面是Java语言实现链表栈的代码:

public class LinkedListStack {
    private Node top;
    
    private class Node {
        private int data;
        private Node next;

        public Node(int data, Node next) {
            this.data = data;
            this.next = next;
        }
    }

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

    public void push(int item) {
        Node newNode = new Node(item, top);
        top = newNode;
    }

    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("Stack is empty!");
        }
        int item = top.data;
        top = top.next;
        return item;
    }

    public int peek() {
        if (isEmpty()) {
            throw new RuntimeException("Stack is empty!");
        }
        return top.data;
    }
}
栈的应用场景

栈在计算机科学和编程中有着广泛的应用场景。下面列举几个常用的场景:

  • 计算表达式:栈在计算表达式时,可以用来判断运算符的优先级,从而得到正确的计算结果。
  • 验证字符串匹配:栈在验证字符串匹配时,可以用来存储打开的括号,以便在关闭括号时进行匹配。
  • 字符串逆转:栈在字符串逆转时,可以用来存储一个字符串中的字符,并在弹出这些字符时,得到逆转后的字符串。
  • 内存管理:栈在内存管理时,可以用来存储函数调用链、局部变量和函数参数等。
总结

堆栈(Stack)是一种数据结构,它具有LIFO(Last In First Out)的特点。栈的实现可以有数组实现和链表实现两种方式。栈在计算机科学和编程中有着广泛的应用场景。