链式栈通过链表实现LIFO,核心操作push、pop、peek时间复杂度均为O(1),动态扩容避免容量限制,需注意析构时释放内存防止泄漏。

在C++中实现链式栈,核心是使用链表结构来模拟栈的“后进先出”(LIFO)特性。相比顺序栈(基于数组),链式栈动态分配内存,避免了容量限制,更加灵活。
链式栈的基本结构
链式栈由一系列节点组成,每个节点包含数据和指向下一个节点的指针。栈顶指针始终指向当前最上面的元素。
定义节点结构和栈类:
struct Node {
int data;
Node* next;
Node(int val) : data(val), next(nullptr) {}
};
class LinkedStack {
private:
Node* top; // 栈顶指针
int size; // 当前元素个数
public:
LinkedStack() : top(nullptr), size(0) {}
~LinkedStack();
void push(int val);
void pop();
int peek() const;
bool isEmpty() const;
int getSize() const;
};
立即学习“C++免费学习笔记(深入)”;
主要操作的实现
链式栈的关键操作包括入栈、出栈、查看栈顶等,时间复杂度均为 O(1)。
入栈(push):创建新节点,将其next指向原栈顶,再更新top指针。
void LinkedStack::push(int val) {
Node* newNode = new Node(val);
newNode->next = top;
top = newNode;
size++;
}
出栈(pop):检查是否为空,删除栈顶节点,top指向下一个节点。
void LinkedStack::pop() {
if (isEmpty()) {
std::cout << "栈为空,无法出栈!\n";
return;
}
Node* temp = top;
top = top->next;
delete temp;
size--;
}
获取栈顶元素(peek):返回top所指节点的数据,不修改栈。
int LinkedStack::peek() const {
if (isEmpty()) {
throw std::runtime_error("栈为空!");
}
return top->data;
}
判空与大小:判断top是否为nullptr,size返回当前元素数量。
bool LinkedStack::isEmpty() const {
return top == nullptr;
}
int LinkedStack::getSize() const {
return size;
}
析构函数与资源管理
由于使用了动态内存,需要手动释放所有节点,防止内存泄漏。
LinkedStack::~LinkedStack() {
while (top != nullptr) {
Node* temp = top;
top = top->next;
delete temp;
}
}
使用时可结合try-catch处理异常,比如访问空栈。整个实现简洁高效,适合不确定数据量或频繁增删的场景。基本上就这些。










