0

C++ で単純なプライオリティ キューを実装しています。

ただし、実行すると意味不明な数字が出力されます。コード内の配列内の無効なエントリにアクセスしようとしていますか?

以下はコードです。

また、私の「削除」機能はどういうわけかその仕事をしていませんか? 概念的には、最初のエントリに null を入力して、消去したばかりのものを返す必要がありますか?

ありがとう。

[優先度.h]

#ifndef Priority_h
#define Priority_h


class Priority
{
    public:
        Priority(void);
        Priority(int s);
        ~Priority(void);

        void insert(long value);
        long remove();
        long peekMin();
        bool isEmpty();
        bool isFull();

        int maxSize;
        long queArray [5];
        int nItems; 

    private:

};

#endif

【プライオリティ.cpp】

#include <iostream>
#include <string>
#include <sstream>
#include <stack>
#include "Priority.h"

using namespace std;

Priority::Priority(void)
{

}

Priority::Priority(int s)
{
    nItems = 0;
}

Priority::~Priority(void)
{

}

void Priority::insert(long item)    
{
      int j;

      if(nItems==0)                         // if no items,
            {
            queArray[0] = item; nItems++;
            }// insert at 0
      else                                // if items,
         {
         for(j=nItems-1; j=0; j--)         // start at end,
            {
            if( item > queArray[j] )      // if new item larger,
               queArray[j+1] = queArray[j]; // shift upward
            else                          // if smaller,
               break;                     // done shifting
            }  // end for
         queArray[j+1] = item;            // insert it
         nItems++;
         }  // end else (nItems > 0)

}

long Priority::remove()             
{ 
    return queArray[0];
}

long Priority::peekMin()            
{ 
    return queArray[nItems-1]; 
}

bool Priority::isEmpty()         
{ 
    return (nItems==0);
}

bool Priority::isFull()          
{
    return (nItems == maxSize); 
}

int main ()
{
      Priority thePQ; 
      thePQ.insert(30);
      thePQ.insert(50);
      thePQ.insert(10);
      thePQ.insert(40);
      thePQ.insert(20);

      while( !thePQ.isEmpty() )
         {
         long item = thePQ.remove();
         cout << item << " ";  // 10, 20, 30, 40, 50
         }  // end while
      cout << "" << endl;

    system("pause");
}
4

3 に答える 3

4

ここに 1 つのエラーがあります。

     for(j=nItems-1; j=0; j--)         // start at end,
                      ^ this is assignment, not comparison.

また、オフバイワンエラーがないことも確信していません

     queArray[j+1] = item;            // insert it

最後に、デフォルトのコンストラクターは初期化に失敗しますnItems

他にもエラーがあるかもしれませんが、ここまでにしておきます。

于 2013-03-20T18:38:33.780 に答える
0

コンストラクターでキュー配列を初期化してみてください。

于 2013-03-20T18:40:04.110 に答える
0

ここで他の回答に同意しますが、これを追加します。

「削除」メソッドは実際には何も削除していません-最初の要素を返すだけですが、配列自体には何もしません。

挿入メソッドにはいくつかの作業が必要であると編集されています-配列の最後に上書きする場合としない場合がありますが、それが何をしているのかについては確かに混乱しています。

于 2013-03-20T18:41:54.183 に答える