大学以来一直听闻优先队列,只是知道个大概不知道具体是怎么用的。今天终于横下心来实现一波优先队列,整体上看了一遍书上的思路就基本明白了优先队列的思想,然后水到渠成地敲出了一个优先队列,也没有遇到多少难缠的bug,学到了一个很好的移动线性表的方法。在考试之前我们所有的一切都是新东西,遇到一个新题目首先去尝试自己想,想不出来立马清空脑袋,接受全新的解题思路,不要尝试用现有的知识去推导新的题目,就像大二的时候学了数据结构却一直在用老旧的c语言大一知识做题,真是很幼稚了,虽然能跑出来正确的结果,现在终于理解了老师为什么不给我作业分。
priorque.h
#pragma once
template<class T>
class priorque {
private:
int count;
T *pqelements;
int maxsize;
void adjust();
public:
priorque(int size);
~priorque();
bool insert(T &x);
bool getfront(T &x);
bool removemin(T &x);
void makeEmpty() { count = 0; }
bool isEmpty() { return (count == 0) ? true : false; }
bool isFull() { return (count == maxsize) ? true : false; }
};
template<class T>
priorque<T>:: ~priorque() {
count = 0;
}
template<class T>
priorque<T>::priorque(int size) {
maxsize = size;
pqelements = new T(maxsize);
count = 0;
}
template<class T>
bool priorque<T>::insert(T &x) {
if (count == maxsize)return false;
pqelements[count++] = x;
adjust();
return true;
}
template<class T>
void priorque<T>::adjust() {
int i = 0;
int temp = pqelements[count - 1];
for ( i = count - 2; i >= 0; i--)
if (temp >= pqelements[i])break;
else pqelements[i + 1] = pqelements[i];
pqelements[i + 1] = temp;
}
template<class T>
bool priorque<T>::removemin(T &x) {
if (count == 0)return false;
else {
x = pqelements[0];
for (int i = 0; i < count; i++)
pqelements[i] = pqelements[i + 1];
count--;
}
return true;
}
template<class T>
bool priorque<T>::getfront(T &x) {
if (count == 0)return false;
x = pqelements[0];
}
main.cpp:
#include"priorque.h"
#include<iostream>
using namespace std;
int main() {
priorque<int> s(10);
int p = 0;
int x = 3;
for (int i = 0; i < 9; i++)
s.insert(i);
s.insert(x);
while (!s.isEmpty()) {
s.removemin(p);
cout << p << endl;
}
}
运行结果