公开课地址:http://see.stanford.edu/see/courseinfo.aspx?coll=11f4f422-5670-4b4c-889c-008262e09e4e
Assignment题目,见Programming Assignments 7
http://see.stanford.edu/see/materials/icspacs106b/assignments.aspx
我使用chunklist实现的priority queue
#include <iostream>
#define MaxElemsPerBlock 4
using namespace std;
class block {
public:
int arr[MaxElemsPerBlock];
int currSize;
block * next;
block() {
currSize = 0;
next = NULL;
}
};
class PQueue {
public:
PQueue();
~PQueue();
int size();
bool isEmpty();
void enqueue(int newElem);
int dequeueMax();
private:
block * chunk;
int totalSize;
void split(block * pt);
};
PQueue::PQueue() {
chunk = new block();
chunk->currSize = 0;
chunk->next = NULL;
this->totalSize = 0;
}
PQueue::~PQueue() {
block * pt;
while(chunk->next != NULL) {
pt = chunk->next;
while(pt->next != NULL) {
pt = pt->next;
}
delete pt;
}
delete this->chunk;
} //删除block的list,从尾到头
int PQueue::size() {
return this->totalSize;
}
bool PQueue::isEmpty() {
if(this->totalSize == 0) return true;
else return false;
}
void PQueue::enqueue(int newElem) {
block * pt = this->chunk;
int i; //记录block插入的位置
bool flag = true;
if(this->totalSize == 0) { pt->arr[0] = newElem; }
else {
//查找该插入的位置
for(pt = this->chunk; pt != NULL; pt = pt->next) {
for(i = 0; i < pt->currSize; i++) {
if(pt->arr[i] >= newElem) continue;
else { flag = false; break; }
}
if(!flag) break;
}
//再插入
for(int j = pt->currSize; j > i; j--)
pt->arr[j] = pt->arr[j - 1];
pt->arr[i] = newElem;
}
pt->currSize++;
this->totalSize++;
//检查block是否满
if(pt->currSize == MaxElemsPerBlock)
split(pt);
}
void PQueue::split(block *pt) {
block * son = new block();
int i, j;
son->currSize = MaxElemsPerBlock - (pt->currSize / 2);
for(i = pt->currSize / 2, j = 0; i < pt->currSize; i++, j++) {
son->arr[j] = pt->arr[i];
pt->arr[i] = 0;
}
pt->currSize /= 2;
son->next = pt->next;
pt->next = son;
}
int PQueue::dequeueMax() {
if(this->totalSize == 0) {
cout<<"Error, PQueue empty!"<<endl;
return -1;
}
int maxNum;
maxNum = this->chunk->arr[0];
for(int i = 0; i < chunk->currSize - 1; i++) {
chunk->arr[i] = chunk->arr[i + 1];
}
chunk->arr[chunk->currSize - 1] = 0;
chunk->currSize--;
this->totalSize--;
if(chunk->currSize == 0) {
block * temp = chunk;
chunk = chunk->next;
delete temp;
}
return maxNum;
}
int main() {
//测试各函数
PQueue myPQ;
for(int i = 0; i <= 3; i++)
myPQ.enqueue(i);
cout<<myPQ.size()<<"start:"<<endl;
while(!myPQ.isEmpty()) {
cout<<myPQ.dequeueMax()<<endl;
}
return 0;
}