QStack使用详解


QStack 是 Qt 提供的一个基于模板的容器类,用于存储同类型对象的栈数据结构。它继承自 QVector,提供了与栈相关的操作方法,如 push(), pop(), 和 top()QStack 的主要用途是在需要后进先出 (LIFO, Last In First Out) 数据结构的场景中。

一、QStack创建和初始化

1.1 创建空的 QStack

QStack<int> stack;

1.2 使用初始值创建 QStack

QStack<int> stack;
stack.push(10);
stack.push(20);
stack.push(30);

二、QStack基本操作

2.1 QStack插入数据 (push)

将元素插入到栈顶:

stack.push(40);

2.2 QStack移除数据 (pop)

从栈顶移除元素:

int topElement = stack.pop();

2.3 QStack查看栈顶元素 (top)

获取栈顶元素但不移除它:

int topElement = stack.top();

2.4 QStack检查栈是否为空 (isEmpty)

判断栈是否为空:

bool empty = stack.isEmpty();

2.5 QStack获取栈的大小 (size)

获取栈中元素的个数:

int size = stack.size();

三、QStack遍历

QStack 继承自 QVector,因此可以使用 QVector 提供的迭代器和循环方式来遍历栈中的元素:

for (int i = 0; i < stack.size(); ++i) {
    qDebug() << stack.at(i);
}

// 使用范围循环
for (const int &element : stack) {
    qDebug() << element;
}
  • 示例代码

下面是一个完整的示例,演示了 QStack 的基本用法:

#include <QCoreApplication>
#include <QStack>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 创建一个 QStack 并插入数据
    QStack<int> stack;
    stack.push(10);
    stack.push(20);
    stack.push(30);

    // 查看栈顶元素
    qDebug() << "Top element:" << stack.top();

    // 从栈顶移除元素
    qDebug() << "Popped element:" << stack.pop();

    // 插入新元素
    stack.push(40);

    // 遍历栈中的元素
    qDebug() << "All elements in the stack:";
    for (const int &element : stack) {
        qDebug() << element;
    }

    // 检查栈是否为空
    bool empty = stack.isEmpty();
    qDebug() << "Is the stack empty?" << empty;

    // 获取栈的大小
    int size = stack.size();
    qDebug() << "Stack size:" << size;

    return a.exec();
}

四、QStack常见用法

4.1 在函数调用中使用栈

栈结构通常用于实现递归算法、表达式求值等。

4.2实现撤销操作

栈可以用来存储用户操作,以便在需要时实现撤销功能。

4.3 深度优先搜索 (DFS)

栈在图的深度优先搜索算法中非常有用。

五、QStack自定义类型

在Qt中,QStack 是一个模板类,可以用来存储任意类型的对象,包括自定义类型。为了在 QStack 中使用自定义类型,需要确保该类型具有必要的构造函数和操作符。以下是如何在 QStack 中使用自定义类型的详细步骤和示例:

  1. 定义自定义类型
    创建一个类来表示自定义类型。确保该类包含必要的构造函数和操作符。

  2. QStack 中使用自定义类型
    定义和操作 QStack 实例,将自定义类型的对象压入栈中,并从栈中弹出对象进行操作。

假设我们有一个表示任务的自定义类型 Task

5.1 定义自定义类型

#include <QString>
#include <QDebug>

class Task {
public:
    Task(int id, const QString &name) : id(id), name(name) {}

    // 必要的成员函数
    int getId() const { return id; }
    QString getName() const { return name; }

    // 友元函数用于输出 Task 对象的信息
    friend QDebug operator<<(QDebug dbg, const Task &task) {
        dbg.nospace() << "Task(ID: " << task.id << ", Name: " << task.name << ")";
        return dbg.space();
    }

private:
    int id;
    QString name;
};

5.2 在 QStack 中使用自定义类型

#include <QStack>
#include <QDebug>

int main() {
    // 创建 QStack 实例来存储 Task 对象
    QStack<Task> taskStack;

    // 向栈中添加任务
    taskStack.push(Task(1, "Task 1"));
    taskStack.push(Task(2, "Task 2"));
    taskStack.push(Task(3, "Task 3"));

    // 输出栈中的任务
    qDebug() << "Tasks in stack:";
    for (const Task &task : taskStack) {
        qDebug() << task;
    }

    // 从栈中取出任务并处理
    while (!taskStack.isEmpty()) {
        Task task = taskStack.pop();
        qDebug() << "Processing" << task;
    }

    return 0;
}

5.3 QStack解释

  1. 定义自定义类型 Task

    • Task 类包含两个成员变量 idname,用来标识任务。
    • 构造函数 Task(int id, const QString &name) 用于初始化任务。
    • getId()getName() 成员函数用于访问任务的ID和名称。
    • 友元函数 operator<< 用于在调试输出中显示任务信息。
  2. QStack 中使用 Task

    • 创建 QStack<Task> 实例 taskStack
    • 使用 push() 方法向栈中依次添加 Task 对象。
    • 使用范围for循环和 QDebug 输出栈中的任务。
    • 使用 pop() 方法从栈中取出任务并处理,直到栈为空。
  • 总结

QStack 提供了一种简单而高效的方式来管理需要后进先出 (LIFO) 处理的数据。通过继承自 QVector,它不仅具备栈的操作方法,还可以利用 QVector 提供的其他功能。无论是在算法实现中还是在应用程序的具体功能中,QStack 都能很好地满足需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三雷科技

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

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

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

打赏作者

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

抵扣说明:

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

余额充值