📜  堆栈数据结构 c++ (1)

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

堆栈数据结构

堆栈是一种线性数据结构,它具有后进先出 (Last-In-First-Out,LIFO) 的特点,即最后一个进入的元素最先被弹出。它可以使用数组和链表来实现。

基本操作

下面是堆栈的基本操作:

  • push():向堆栈中添加一个元素;
  • pop():从堆栈中弹出一个元素;
  • top():获取堆栈顶端的元素;
  • empty():判断堆栈是否为空;
  • size():获取堆栈的大小。
数组实现

使用数组来实现堆栈,需要定义一个数组作为堆栈的存储空间,并使用一个整数变量 top 来指向堆栈顶端的元素的位置。在定义数组时,需要指定它的最大大小。

constexpr int MAX_SIZE = 100; // 最大大小
int stack[MAX_SIZE]; // 堆栈数组
int top = -1; // 栈顶指针

void push(int x)
{
    if (top == MAX_SIZE - 1) {
        printf("Error: stack overflow.\n"); // 堆栈已满
        return;
    }
    stack[++top] = x; // 入栈
}

void pop()
{
    if (top == -1) {
        printf("Error: stack underflow.\n"); // 堆栈已空
        return;
    }
    top--; // 出栈
}

int top()
{
    if (top == -1) {
        printf("Error: stack underflow.\n"); // 堆栈已空
        return -1;
    }
    return stack[top]; // 返回栈顶元素
}

bool empty()
{
    return top == -1; // 判断堆栈是否为空
}

int size()
{
    return top + 1; // 返回堆栈的大小
}
链表实现

另一种实现堆栈的方法是使用链表。在链表中,每个节点都有一个指向前一个节点的指针。使用链表来实现堆栈,只需要定义一个指向链表头的指针即可。

struct node {
    int val;
    node *prev;
    node(int x) : val(x), prev(nullptr) {}
};

class stack {
private:
    node *head;
    int sz;
public:
    stack() : head(nullptr), sz(0) {}

    void push(int x) {
        node *new_node = new node(x);
        new_node->prev = head;
        head = new_node;
        sz++;
    }
    
    void pop() {
        if (head == nullptr) {
            printf("Error: stack underflow.\n");
            return;
        }
        node *tmp = head;
        head = head->prev;
        delete tmp;
        sz--;
    }
    
    int top() {
        if (head == nullptr) {
            printf("Error: stack underflow.\n");
            return -1;
        }
        return head->val;
    }
    
    bool empty() {
        return head == nullptr;
    }
    
    int size() {
        return sz;
    }
};
总结

堆栈是一种非常重要的数据结构,在计算机科学中广泛应用。它可以用于函数调用和递归算法等方面。本文介绍了两种实现堆栈的方法,即数组和链表。如果你对本文有任何疑问或建议,请在评论区留言。