📅  最后修改于: 2023-12-03 15:23:07.936000             🧑  作者: Mango
本文将介绍如何使用链表来实现堆栈(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;
}
本文介绍了如何使用链表来实现堆栈数据结构,其中包括链表的定义和堆栈的入栈、出栈和获取栈顶元素的实现。希望能够对大家有所帮助。