📜  在 cpp 中使用链表实现堆栈 - C++ (1)

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

在 cpp 中使用链表实现堆栈

本文将介绍如何使用链表来实现堆栈(stack)数据结构,其中使用了 C++ 语言。

什么是堆栈

堆栈是一种常用的数据结构,它的特点是“后入先出”(Last In First Out,LIFO)。什么意思呢?比如我们平常拿到的一摞书,我们把书一本一本放在最上面,然后我们要借第一本书,我们必须把上面所有的书拿起来,才能把第一本书拿出来。换句话说,最后放进去的书,要先拿出来。

堆栈的应用有很多,比如函数调用、表达式求值、迷宫游戏等等。

关于链表

首先,我们需要了解一下链表。链表是一种线性数据结构,它由若干个节点组成,每个节点包含数据和指向下一个节点的指针。

链表可以分为单链表、双向链表和循环链表,本文主要讲解单链表。

对于链表的增删查改等操作,可以参考这篇文章:链表基本操作

用链表实现堆栈

接下来,我们将利用链表来实现堆栈。

首先,我们定义节点 Node

struct Node {
    int data; // 数据
    Node* next; // 指向下一个节点的指针
};

然后,我们定义堆栈 Stack

class Stack {
private:
    Node* top; // 栈顶指针
public:
    Stack(); // 构造函数
    ~Stack(); // 析构函数
    bool isEmpty(); // 判断栈是否为空
    void push(int data); // 入栈
    int pop(); // 出栈
    int getTop(); // 获取栈顶元素
};

堆栈的构造函数、析构函数和判断栈是否为空的函数与普通的链表实现一样,不再赘述。我们重点讲解入栈、出栈和获取栈顶元素的函数。

入栈

我们在链表的头部插入新的节点,这样最后插入的节点就成了栈顶。

void Stack::push(int data) {
    Node* newNode = new Node;
    newNode->data = data;
    newNode->next = top;
    top = newNode;
}
出栈

我们将链表头部的节点删除,这样链表的第二个节点就成了栈顶。

int Stack::pop() {
    if (isEmpty()) {
        return -1; // 如果栈为空,则返回 -1
    }
    Node* tempNode = top;
    int data = tempNode->data;
    top = top->next;
    delete tempNode;
    return data;
}
获取栈顶元素

我们返回链表头部的节点的值,也就是堆栈顶部的元素。

int Stack::getTop() {
    if (isEmpty()) {
        return -1; // 如果栈为空,则返回 -1
    }
    return top->data;
}
完整代码
struct Node {
    int data; // 数据
    Node* next; // 指向下一个节点的指针
};

class Stack {
private:
    Node* top; // 栈顶指针
public:
    Stack(); // 构造函数
    ~Stack(); // 析构函数
    bool isEmpty(); // 判断栈是否为空
    void push(int data); // 入栈
    int pop(); // 出栈
    int getTop(); // 获取栈顶元素
};

Stack::Stack() {
    top = nullptr;
}

Stack::~Stack() {
    while (!isEmpty()) {
        pop();
    }
}

bool Stack::isEmpty() {
    return top == nullptr;
}

void Stack::push(int data) {
    Node* newNode = new Node;
    newNode->data = data;
    newNode->next = top;
    top = newNode;
}

int Stack::pop() {
    if (isEmpty()) {
        return -1; // 如果栈为空,则返回 -1
    }
    Node* tempNode = top;
    int data = tempNode->data;
    top = top->next;
    delete tempNode;
    return data;
}

int Stack::getTop() {
    if (isEmpty()) {
        return -1; // 如果栈为空,则返回 -1
    }
    return top->data;
}
总结

本文介绍了如何使用链表来实现堆栈数据结构,其中包括链表的定义和堆栈的入栈、出栈和获取栈顶元素的实现。希望能够对大家有所帮助。