【殷人昆数据结构】第三章3.5 优先级队列Priority Queue代码的调试

Priority Queue优先级队列

主函数

#include <fstream>
#include <cassert>
#include "PQueue.h"
using namespace std;

int main(){
	ifstream fin("data.txt");
	assert(fin);
	PQueue<int> que;
	int data;
	while (!fin.eof())	{
		assert(fin >> data); 
		que.EnQueue(data);
	}
	cout << "The queue in the file is:\n" << que << endl;
	que.getFront(data);
	cout << "The front in the queue is: " << data << endl;
	
	cout << "Delete the front in turn, the result is:" << endl;
	int len = que.getSize();
	for(int i = 0; i < len; i++){
		que.DeQueue(data);
		cout << "Delete " << data << ", then the queue is:\n";
		cout << que << endl;
	}
	return 0;
}

类定义

const int DefaultPQSize = 50;

template <typename T>class PQueue{
public:
	PQueue(int sz = DefaultPQSize);
	~PQueue(){
		delete[] pqelements;
	}
	bool EnQueue(const T &x);
	bool DeQueue(T &x);
	bool getFront(T &x)const;
	void makeEmpty(){
		count = 0;
	}
	bool IsEmpty()const{
		return count == 0;
	}
	bool IsFull()const{
		return count == maxSize;
	}
	int getSize()const{
		return count;
	}
	friend ostream& operator<<(ostream & os, PQueue<T> &Q){
		for (int i = 0; i < Q.count; i++)
			os << "#" << i <<": " << Q.pqelements[i] << endl;
		os << "Queue Size: " << Q.getSize() << endl;
		return os;
	}
protected:
	T *pqelements;
	int count;
	int maxSize;
	void adjust();	//将队尾元素调整到适当位置
};

构造函数

template <typename T>PQueue<T>::PQueue(int sz){
	maxSize = sz;
	count = 0;
	pqelements = new T[maxSize];
	assert(pqelements);
}

提问:这里为何不是assert(pqelements!=NULL);?
因为assert();测试的是肯定不会发生的错误,比如内存溢出(我不知道)、执行到不该执行的代码等编译阶段出现的错误,仅仅在调用时使用。因此assert面向的是非法情况,而不是程序使用过程中出现的错误。在碰到断言错误时,程序应立即终止。
在这里,assert(pqelements);这条语句的作用是检查内存分配中存不存在非法情况,与程序之外的因素有关。这是程序员所控制不了的,电脑太复杂,我们只能确定这里有问题,让程序终止。
NULL在这里仍是一个可能碰到的情况,输入为0或者负数时程序也可以正常运行,只是输出的结果有误。这是程序员与使用者可以控制的情况,因此可以通过if语句等来控制。因此写成assert(pqelements!=NULL);是错误的。

EnQueue、adjust和DeQueue函数

template <typename T>bool PQueue<T>::EnQueue(const T &x){
	if (count == maxSize)	return false;
	pqelements[count] = x;
	count++;
	adjust();  //adjust
	return true;
}

//将队尾元素调整到适当位置
template <typename T>void PQueue<T>::adjust(){
//原来排好队,新进来一个
	T item = pqelements[count-1];
	int j;
	for (j = count-2; j >= 0; j--){
		if (pqelements[j] <= item){//重载:T型判大小
			break;
		}
		else{
			pqelements[j+1] = pqelements[j];
		}
	}
	pqelements[j+1] = item;
}

template <typename T>bool PQueue<T>::DeQueue(T& x){
//采用线性表方式,不采用队方式
	if (count == 0)	return false;
	x = pqelements[0];
	for (int i = 1; i < count; i++)
		pqelements[i-1] = pqelements[i];
	count--;
	return true;
}

getFront函数

template <typename T>bool PQueue<T>::getFront(T &x)const{
	if (count == 0)	return false;
	x=pqelements[0];
	return true;
}

整一个头文件:

#ifndef PQUEUE_H
#define PQUEUE_H
#include <cassert>
#include <iostream>
using namespace std;

const int DefaultPQSize = 50;

template <typename T>class PQueue{
public:
	PQueue(int sz = DefaultPQSize);
	~PQueue(){
		delete[] pqelements;
	}
	bool EnQueue(const T &x);
	bool DeQueue(T &x);
	bool getFront(T &x)const;
	void makeEmpty()	{
		count = 0;
	}
	bool IsEmpty()const{
		return count == 0;
	}
	bool IsFull()const{
		return count == maxSize;
	}
	int getSize()const{
		return count;
	}
	friend ostream& operator<<(ostream & os, PQueue<T> &Q){
		for (int i = 0; i < Q.count; i++)
			os << "#" << i <<": " << Q.pqelements[i] << endl;
		os << "Queue Size: " << Q.getSize() << endl;
		return os;
	}
protected:
	T *pqelements;
	int count;
	int maxSize;
	void adjust();	// ½«¶ÓβԪËص÷Õûµ½Êʵ±Î»ÖÃ
};

template <typename T>PQueue<T>::PQueue(int sz){
	maxSize = sz;
	count = 0;
	pqelements = new T[maxSize];
	assert(pqelements);
}

template <typename T>bool PQueue<T>::EnQueue(const T &x){
	if (count == maxSize)	return false;
	pqelements[count] = x;
	count++;
	adjust();
	return true;
}

// ½«¶ÓβԪËص÷Õûµ½Êʵ±Î»ÖÃ
template <typename T>void PQueue<T>::adjust(){//Ô­À´Åźöӣ¬Ð½øÀ´Ò»¸ö
	T item = pqelements[count-1];
	int j;
	for (j = count-2; j >= 0; j--){
		if (pqelements[j] <= item){// ÖØÔØ£ºTÐÍÅдóС
			break;
		}
		else{
			pqelements[j+1] = pqelements[j];
		}
	}
	pqelements[j+1] = item;
}

template <typename T>bool PQueue<T>::DeQueue(T& x){//²ÉÓÃÏßÐÔ±í·½Ê½£¬²»²ÉÓöӷ½Ê½
	if (count == 0)	return false;
	x = pqelements[0];
	for (int i = 1; i < count; i++)
		pqelements[i-1] = pqelements[i];
	count--;
	return true;
}

template <typename T>bool PQueue<T>::getFront(T &x)const{
	if (count == 0)	return false;
	x=pqelements[0];
	return true;
}
#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值