现在的位置: 首页 > 综合 > 正文

队列 Queue_Bag Bag类,栈队列基类

2014年03月03日 ⁄ 综合 ⁄ 共 2681字 ⁄ 字号 评论关闭

 

#include <iostream.h>
#include <assert.h>
#define DefaultSize 10
template <class T> class Stack;
template <class T> class Queue;
template <class T> class PQueue;
// Bag类的定义
template <class T>
class Bag 
{
 friend class Stack<T>;
 friend class Queue<T>;
 friend class PQueue<T>;
 
public:
 Bag(int sz = DefaultSize);     //构造函数
 virtual ~Bag();        //析构函数
 virtual void Add(const T& item);   //插入函数
 virtual T *Remove();      //删除函数
 virtual int IsEmpty() { return top == -1; } //判空函数
 virtual int IsFull() { return top == maxSize - 1; }  //判满函数
private:
 virtual void Empty() { cout << "Data Structure is empty." << endl; }
 virtual void Full() { cerr << "DataStructure is full." << endl; }
 T *elements;         //存储数组
 int maxSize;         //数组的大小
 int top;          //数组当前元素个数
};
// Bag类的构造函数
template <class T> 
Bag<T>::Bag(int MaxBagSize):maxSize(MaxBagSize) 
{
 elements = new T[maxSize];
 top = -1;
}
// Bag类的析构函数
template <class T>
Bag<T>::~Bag() 
{
 delete [] elements;
}
// Bag类的插入函数
template <class T>
void Bag<T>::Add(const T & item) 
{
 if (IsFull()) 
  Full();
 else 
  elements [++top] = item;
}
// Bag类的删除函数
template <class T>
T *Bag<T>::Remove() 
{
 if(IsEmpty()) 
 {
  Empty(); 
  return NULL; 
 }
 T &x = elements [0];     //保存被删除元素的值
 for(int i = 0; i < top; i++)   //后面元素填补上来
  elements [i] = elements [ i+1];
 top--;
 return &x;
}
// 栈的类定义(继承Bag类)
//------------------------------------------------------------------------------------------------stack
template <class T> 
class Stack:public Bag<T>
{
public:
 Stack(int sz = DefaultSize);    //构造函数
 ~Stack();         //析构函数
 T *Remove();         //删除函数
};
// 栈的构造函数
template <class T>
Stack<T>::Stack(int sz):Bag<T>(sz) {} //栈的构造函数Stack将调用Bag的构造函数
 
// 栈的析构函数
template <class T> 
Stack<T>::~Stack() {} //栈的析构函数将自动调用Bag的析构函数, 以确保数组elements的释放
 
// 栈的删除函数
template <class T> 
T * Stack<T>::Remove() 
{
 if(IsEmpty())
 {
  Empty();
  return NULL; 
 }
 T &x = elements[top--];
 return &x;
}
// 队列的类定义(继承Bag类)
//------------------------------------------------------------------------------------------------Queue
template <class T> 
class Queue:public Bag<T> 
{
public:
 Queue(int sz = DefaultSize);     //构造函数
 //~Queue();          //析构函数
 //T *Remove(); 
};
 
// 队列的构造函数
template <class T> 
Queue<T>::Queue(int sz):Bag<T>(sz) {}    //队列的构造函数Queue将调用Bag的构造函数

// 优先级队列的类定义(继承Bag类)
//------------------------------------------------------------------------------------------------PQueue
template <class T> 
class PQueue:public Bag<T> 
{
public:
 PQueue(int sz = DefaultSize);    //构造函数
 ~PQueue() {}        //析构函数
 T *Remove();        //删除函数
};
// 优先级队列的构造函数
template <class T> 
PQueue<T>::PQueue(int sz):Bag<T>(sz) {}  //建立一个最大具有sz个元素的空优先级队列。top = -1。
 
// 优先级队列的删除函数
template <class T> 
T *PQueue<T>::Remove() 
{
 //若优先级队列不空则函数返回该队列具最大优先权(值最小)元素的值, 同时将该元素删除。
 if(IsEmpty())
 {
  Empty(); 
  return NULL; 
 }
 T &min = elements[0];      //假设elements[0]是最小值,继续找最小值 
 int minindex = 0;
 for(int i = 1; i <= top; i++) 
 {
  if(elements[i] < min)
  {
   min = elements[i];
   minindex = i; 
  }
 }
 
 elements[minindex] = elements[top];   //用最后一个元素填补要取走的最小值元素
 top--;
 
 return &min;        //返回最小元素的值
}
void main()
{
 Stack<int> aStack(10);
 Queue<int> aQueue(10);
 PQueue<int> aPQueue(10);
 aStack.Add(1);
 aQueue.Add(2);
 int n = *aQueue.Remove();
 cout << n;
 
}

抱歉!评论已关闭.