Standford cs106B Assignment #6 Priority Queue

本文介绍了一种使用chunklist实现的优先队列算法,并提供了代码实现。包括优先队列的基本操作如入队、出队最大元素等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公开课地址: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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值