c++ - 我需要使用具有 C++ 的 add() 和 remove() 函数的字符串创建一个优先级队列

标签 c++ string priority-queue

所以我在这个 C++ 课上,我似乎不明白如何解决这个问题。

为字符串实现优先级队列。优先级队列与常规队列类似,只是添加到队列中的每个项目也具有关联的优先级。对于这个问题,将优先级设置为一个整数,其中0是最高优先级,值越大优先级越低。

删除函数应返回并删除具有最高优先级的项目,例如:

q.add("X",10);
q.add("Y",1);
q.add("Z",3);

cout << q.remove(); //returns Y
cout << q.remove(); //returns Z
cout << q.remove(); //returns X

.

这是我到目前为止所拥有的。

http://pastebin.com/AgXL9dfq

基本上,我只需要add()和remove()函数,但我不明白如何实现。有什么帮助吗?提前致谢。

最佳答案

这是使用 std::map 的另一个解决方案和std::vector

#include <iostream>
#include <map>
#include <vector>

class priority_queue {
    std::map<int, std::vector<std::string>> queue;
public:
    void add(int priority, std::string str) {
        if(!queue[priority].empty()) {
            queue[priority].push_back(str);
        } else {
            std::vector<std::string> vec;
            vec.push_back(str);
            queue[priority] = vec;
        }
    }
    std::string remove() {
        if(!queue.begin()->second.empty()) {
            std::string temp = queue.begin()->second[0];
            queue.begin()->second.erase(queue.begin()->second.begin());
            if(queue.begin()->second.empty())
                queue.erase(queue.begin());
            return temp;
        }
        std::cout << "ERROR: QUEUE EMPTY!" << std::endl;
        return "";
    }
};


int main() {
    priority_queue pq;

    pq.add(10, "hello");
    pq.add(10, "world");
    pq.add(11, "how");
    pq.add(12, "are");
    pq.add(13, "you?");

    std::cout << pq.remove() << std::endl;
    std::cout << pq.remove() << std::endl;
    std::cout << pq.remove() << std::endl;
    std::cout << pq.remove() << std::endl;
    std::cout << pq.remove() << std::endl;
}

它生成以下输出:

hello
world
how
are
you?

它通过使用键值为 int 的映射来工作。表示优先级, std::vector<std::string>因为它的值,即具有相同优先级的值的集合。

add()方法检查映射中是否已经存在具有给定优先级的值 - 如果存在,它只是将字符串值推到 vector 的后面,如果没有,它会创建一个新 vector ,推回该值,并将其分配给 map[priority] .

remove()方法检查队列是否为空,如果不为空,则从值容器 vector 的前面取出适当的值来返回;如果“弹出”字符串恰好是 vector 中的最后一个,则意味着不再有与其优先级相关的值,并且整个条目将从映射中删除,以免引起进一步的问题。

关于c++ - 我需要使用具有 C++ 的 add() 和 remove() 函数的字符串创建一个优先级队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19986329/

相关文章:

C++ valgrind : Conditional jump or move depends on uninitialised value(s) don't know what to initialize

c++ - 什么是 c++11/14/17 等同于 ltoa/itoa 的 C 函数?

java - 电话号码到字符转换器

c++ - 在 boost::heap::priority_queue 中推送结构对象时出错

algorithm - 为什么 Dijkstra 的算法使用减少键?

c++ - 从全局内核调用宿主函数

c++ - 为什么会有注入(inject)的类名?

Java 使用分隔符分割字符串 IndexOutOfBoundException

scala - 在 Scala 中创建最小堆最简单、最有效的方法是什么?

c++ - 支持 OpenGL3 的 GUI-Toolkit