链式栈的基本操作

链式栈深度解析

链式栈核心特性

graph TD
    A[链式栈] --> B[动态内存分配]
    A --> C[无容量限制]
    A --> D[高效增删操作]
    B --> E[避免内存浪费]
    C --> F[适合不确定数据量场景]
    D --> G[O(1)时间复杂度]

一、现代C++链式栈实现

模板类实现(智能指针版)

#include <memory>
#include <stdexcept>

template <typename T>
class LinkedStack {
private:
    struct Node {
        T data;
        std::unique_ptr<Node> next;
        explicit Node(T val) : data(val), next(nullptr) {}
    };

    std::unique_ptr<Node> top; // 栈顶指针

public:
    LinkedStack() = default;

    // 禁止拷贝构造和赋值
    LinkedStack(const LinkedStack&) = delete;
    LinkedStack& operator=(const LinkedStack&) = delete;

    bool empty() const {
        return !top;
    }

    void push(T value) {
        auto newNode = std::make_unique<Node>(value);
        newNode->next = std::move(top);
        top = std::move(newNode);
    }

    T pop() {
        if (empty()) {
            throw std::out_of_range("Pop from empty stack");
        }
        T value = top->data;
        top = std::move(top->next);
        return value;
    }

    const T& peek() const {
        if (empty()) {
            throw std::out_of_range("Peek from empty stack");
        }
        return top->data;
    }

    // 析构函数自动处理内存释放
    ~LinkedStack() = default;
};

关键优化点

  1. 智能指针管理:自动内存释放避免泄漏
  2. 异常安全:空栈操作抛出标准异常
  3. 移动语义:高效节点所有权转移
  4. 模板支持:泛型数据类型存储
  5. 禁用拷贝:防止意外复制导致资源问题

二、核心操作复杂度分析

操作时间复杂度空间复杂度缓存友好性
入栈(push)O(1)O(1)
出栈(pop)O(1)O(1)
查看栈顶(peek)O(1)O(1)

注:链式结构因指针跳转导致缓存不友好,适合低频大对象存储


三、扩展功能

1. 线程安全栈

#include <mutex>

template <typename T>
class ConcurrentStack {
    LinkedStack<T> stack;
    mutable std::mutex mtx;

public:
    void push(T value) {
        std::lock_guard<std::mutex> lock(mtx);
        stack.push(value);
    }

    T pop() {
        std::lock_guard<std::mutex> lock(mtx);
        return stack.pop();
    }

    bool empty() const {
        std::lock_guard<std::mutex> lock(mtx);
        return stack.empty();
    }
};

2. 迭代器支持

class Iterator {
    Node* current;
public:
    explicit Iterator(Node* node) : current(node) {}
    
    T& operator*() { return current->data; }
    Iterator& operator++() {
        if (current) current = current->next.get();
        return *this;
    }
    bool operator!=(const Iterator& other) { 
        return current != other.current; 
    }
};

Iterator begin() { return Iterator(top.get()); }
Iterator end() { return Iterator(nullptr); }

四、典型应用场景

1. 函数调用栈模拟

主函数 函数A 函数B 压入栈帧 压入栈帧 弹出栈帧 弹出栈帧 主函数 函数A 函数B

2. 浏览器历史记录

class BrowserHistory {
    LinkedStack<std::string> backStack;
    LinkedStack<std::string> forwardStack;

public:
    void visit(const std::string& url) {
        backStack.push(url);
        forwardStack = LinkedStack<std::string>(); // 清空前向栈
    }

    std::string back() {
        if (backStack.empty()) return "";
        forwardStack.push(backStack.pop());
        return backStack.peek();
    }

    std::string forward() {
        if (forwardStack.empty()) return "";
        backStack.push(forwardStack.pop());
        return backStack.peek();
    }
};

五、最佳实践指南

1. 实现选择建议

场景推荐方案说明
高频小对象操作数组栈缓存友好
大对象存储链式栈避免内存复制
多线程环境并发安全栈保证线程安全
需要遍历操作迭代器支持提供遍历接口

2. 内存管理技巧

// 对象池优化
template <typename T>
class NodePool {
    std::stack<std::unique_ptr<Node>> pool;
public:
    std::unique_ptr<Node> acquire(T val) {
        if (pool.empty()) {
            return std::make_unique<Node>(val);
        }
        auto node = std::move(pool.top());
        pool.pop();
        node->data = val;
        return node;
    }
    
    void release(std::unique_ptr<Node> node) {
        pool.push(std::move(node));
    }
};

六、扩展阅读与测试

单元测试示例

TEST(LinkedStackTest, BasicOperations) {
    LinkedStack<int> stack;
    ASSERT_TRUE(stack.empty());
    
    stack.push(10);
    ASSERT_FALSE(stack.empty());
    ASSERT_EQ(stack.peek(), 10);
    
    ASSERT_EQ(stack.pop(), 10);
    ASSERT_TRUE(stack.empty());
}

TEST(LinkedStackTest, ExceptionSafety) {
    LinkedStack<int> stack;
    ASSERT_THROW(stack.pop(), std::out_of_range);
    ASSERT_THROW(stack.peek(), std::out_of_range);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

star _chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值