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