【问题标题】:C++ - How to delete a max element from queueC++ - 如何从队列中删除最大元素
【发布时间】:2020-12-15 19:11:28
【问题描述】:

从标题中可以看出,我想从使用数组实现的队列中删除一个元素。

例如,如果我有:

array[]={1,5,4,3,2}

我希望它看起来像这样

array[]={1,4,3,2}

我需要从队列中删除它,但上面只是我想要做的一个简单版本。以下是可能对您有所帮助的其余代码,对我有所帮助。

class QueueArray: Queue <InfoTip> {

private:
 int capacity; // capacity
 int beginning; // index of the first element
 int end; // end of the array
 InfoTip *elements; // elements of queue

public:
 QueueArray(int capacity = 10) : capacity(capacity), // Konstruktor
 beginning(-1),end(-1), elements (new InfoTip[capacity]) {}
 ~QueueArray() { delete [] elements; }

template <typename InfoTip> // putting elements in a queue
void QueueArray<InfoTip>::putInArray(const InfoTip &x) {
     end = (end + 1) % capacity;
     elements[end] = x;
     if (beginning == -1)
         beginning= 0;
    }

这是我为从队列数组中删除最大元素而编写的函数

template <typename InfoTip>
void QueueArray<InfoTip>::deleteMax() {
    InfoTip max = 0;
    for(int i = 0; i < capacity; i++) {
        if(max < elements[i]) {
            max = elements[i];
        }
    }

【问题讨论】:

  • 为什么不在队列实现中使用std::vector 而不是new[]delete[]
  • 开始不是开始
  • @bloody 兄弟/姐妹这并不重要。不要评论只是为了得分哈哈
  • 我的评论与您的​​问题有关。使用std::vector,而不是您的代码处理内存管理。删除最大元素是一两行代码,没有多少行充满new[]delete[]调用。
  • 请注意,cmets 可能与呈现代码的任何方面有关。这就是 cmets 的用途,而不是 an answer。帮助/建议/建议/引起注意。英语相关的 cmets 常见吗?不——我承认。然而,正确的拼写有助于代码的流畅和不间断的可读性,所以如果你不这么认为,这甚至不仅仅是纯粹的语言评论。据我所见,cmets总是带着一份善意。因此,不要误判他们的意图或看到他们在伪装。 Stackoverflow 是一个专业的门户网站,而不是一个年轻的 Facebook 聊天室。祝你好运!

标签: c++ arrays queue max


【解决方案1】:

帮自己一个大忙,像这样使用 STL 容器和算法:

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v { 1,2,3,4,5,4,3,2,1 };
    v.erase(std::max_element(v.begin(), v.end()));
    for (auto x : v)
        std::cout << x << "  ";
    std::cout << "\n";
}

打印:1 2 3 4 4 3 2 1

【讨论】:

    【解决方案2】:

    如果你想使用队列。

    首先,您必须创建一个 temp 变量,该变量将存储您的所有 element 数据。

    for(int i = 0; i < capacity; i++) {
      if(max < elements[i]) {
        max = elements[i];
      }
      temp[i] = elements[i];
    }
    

    然后你必须创建一个bool isTrue 变量,因为在找到最大元素后你必须跳过一个元素

    bool isTrue = false;
    for(int i = 0; i < capacity-1; ++i) {
      if(temp[i] == elements[i]) {
        isTrue = true;
      }
      if(isTrue==true) {
        elements[i] = temp[i+1];
      }
      else {
        elements[i] = temp[i];
      }
    }
    

    【讨论】:

    • 房间里的大象是没有调整条目的数量。这个解决方案所做的就是将所有内容移至一个条目。 vector 答案更简洁,实际上会自动调整大小。
    • @PaulMcKenzie 他想使用queue , not vector`。我只是回答他的问题。我知道在这种情况下使用向量是最好的选择,但他想使用队列。
    • 我知道他想使用队列。问题是您没有在回答中提到队列保持相同的大小,这是您的回答中忽略的一个非常重要的方面。
    猜你喜欢
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多