使用优先级队列C ++进行堆栈

时间:2014-04-29 01:29:09

标签: c++ sorting heap priority-queue

我的代码适用于将数据放入数组中,但是当我将其打印出来时,它总是在第一个数字后崩溃。我的冒泡功能一定有问题,你能指出它有什么问题吗?提前谢谢。

#include<iostream>
#include <string>
#include<fstream>
using namespace std;

void bubbleup(int pq[], int back);
void bubbledown(int pq[], int front, int back);
void swap(int &a, int &b);

int main(){
    ifstream infile;
    ofstream outfile;
    string input, output;
    int size,number;
    int front=1, back=0;
    int *pq=new int[size]; // dynamically allocate array
    cout<<"What's the input file name?"<<endl;
    getline(cin, input); // get the input name
    infile.open(input.c_str());// open the input file

    while(!(infile.eof())){
      infile>>number; // infile to an integer type variable first instead of an array. this is why your program doesn't work!!!!!
      back++;
      pq[back]=number;
      bubbleup(pq,back);
      for(int i=1;i<=back;i++)
        cout<<pq[i]<<" ";
      cout<<endl;
    }
    cout<<"what's the output file name?"<<endl;
    getline(cin, output);
    outfile.open(output.c_str());
    while(back!=0){
        cout<< pq[front]<<endl;
        outfile<< pq[front]<<endl;
        pq[front]=pq[back];
        back--;
        bubbledown(pq,front,back);
    }
}
//bubbleup function
void bubbleup(int pq[], int back)
{
     int fatherindex=back/2;
        while(!(pq[back]>=pq[fatherindex])||!(back==1)){

          if(pq[back]<pq[fatherindex])
           swap(pq[back],pq[fatherindex]);
           back=fatherindex;
           fatherindex=back/2;
        }   
}

//bubbledown function
void bubbledown(int pq[], int front, int back){
    int fatherindex=front,kidindex;
    while(2*fatherindex+1 <= back){
        kidindex=2*fatherindex+1;
        if((kidindex+1<back) && (pq[kidindex]<pq[kidindex+1])){
           kidindex++;
           }
        if(pq[fatherindex] > pq[kidindex]){
           swap(pq[fatherindex],pq[kidindex]);
           fatherindex=kidindex;
        }
        else
          return;
    }
}
//swap function
void swap(int &a, int &b){
    int t=a;
        a=b;
        b=t;
}

1 个答案:

答案 0 :(得分:0)

要看一些问题

  • 在使用之前,您不会初始化size,因此您的pq内存可以是任意大小。

  • 您正在使用基于1的数组访问权限,因此请确保分配的数量超过您的需要。

  • while(!back==0)可以工作,但它在int上做布尔逻辑,然后将结果与int进行比较。 while(back!=0)更容易阅读,并且会产生更少的编译器警告。

编辑:如果没有触发测试,你的bubbleDown函数也会有无限循环。