各位高手帮帮忙这个实习题目我是在不会,哪位好心帮忙做了吧!谢了!(Queue)类模板!

ricky9087 2009-06-22 03:58:11

学习教科书中有关类模板的内容,编写一个通用的队列(Queue)类模板。
 队列为顺序循环队列;
 队头、队尾指针分别用front、rear表示;
 front=rear表示队列空;
 (rear+1)%size=front表示队列满。
【要求】
1. 顺序队列空间为动态分配内存空间获得;
2. 应包括对队列入队、出队和打印等基本操作;
3. 增加判断队列为空、判断队列已满等成员函数,并进行测试;
4. 为使成员函数Print()适用于任意类型(例如student类)队列,可通过重载<<来解决。
5. 作为练习,有能力的学生可以考虑改为链队列类模板的编程问题。(选做内容)
6.修改程序,增加一个标志变量flag,用于区分队列“满”还是“空”。所给程序中,front= rear表示队列空,(rear+1)%size=front表示队列满。这样,造成有一个单元空闲不能使用的情况。修改后,当front=rear时,由flag的值判断空或满,从而使每个单元都能利用。

参考程序如下,请按上述6点要求修改、完善参考程序,并给出测试运行结果。

#include <iostream.h>
#include <string.h>

template <class T>
class Queue
{
int size; //队列空间大小,最大队列元素个数为size-1
int front,rear; //队列头、尾指针
T *queuePtr; //队列存储空间的头指针
public:
Queue(int=10); //构造函数,默认数组大小为10
~Queue() { delete []queuePtr; } //Queue的析构函数
bool EnQueue(T x); //入队操作:元素x入队
bool DeQueue(T &x); //出队操作,由x返回出队元素
void Print();
};
template <class T> Queue<T>::Queue(int s) //构造函数
{
size=s>0?s:10;
front=rear=0;
queuePtr=new T[size];
}
template <class T>
void Queue<T>::Print()
{
if (front==rear) return;//空队列,不打印
int i=front;
while (i!=rear)
{
cout<<queuePtr[i]<<" ";
i=(i+1)%size;
}
cout<<endl;
}

template <class T>
bool Queue<T>::EnQueue(T x) //入队
{
if ((rear+1)%size==front)//队列满
{
cout<<"错误:队列已满,不能写入"<<x<<"!\n";
return false;
}
queuePtr[rear]=x; //改写原有元素
rear=(rear+1)%size;
return true;
}

template <class T>
bool Queue<T>::DeQueue(T& x) //出队
{
if(front==rear) //队列空
{
cout<<"错误:队列空,不能出队。\n";
return false;
}
x=queuePtr[front];
front=(front+1)%size;
return true;
}

class student
{
int id;
char name[12];
public:
void Set(int i,char *nm)
{ id=i;strcpy(name,nm); }
friend ostream& operator <<(ostream& os,student &rp);
};
ostream& operator <<(ostream &os,student &p)
{ //对student对象,重载运算符<<
cout<<p.id<<','<<p.name<<" ";
return os;
}
void main()
{
Queue<double> a(8);
int i,k=1;double d=1.5;
while (a.EnQueue(d++));
cout<<"当前队列a中的元素为:\n";a.Print();
cout<<"开头3个出队元素为:\n";
for (i=0;i<3;i++)
if (a.DeQueue(d)) cout<<d<<" ";
cout<<endl;
cout<<"当前队列a中的元素为:\n";a.Print();
Queue<int> b;
for (i=0;i<10;i++,k++)
b.EnQueue(k);
cout<<"当前队列b中的元素为:\n";b.Print();
cout<<"队列b的出队序列为:\n";
while (b.DeQueue(k)) cout<<k<<" ";
cout<<endl;
Queue<student> c(7);
student st;
char *nm[]={"Wang","Zhang","Huang","Zhou","Yang","Chen","Liu"};
int Id=1401050301;
for (i=0;i<7;i++)
{
st.Set(Id+i,nm[i]);
c.EnQueue(st);
}
cout<<"当前队列c中的元素为:\n";c.Print();
cout<<"队列c的出队序列为:\n";
while (c.DeQueue(st)) cout<<st<<" ";
cout<<endl;
}


...全文
73 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ricky9087 2009-06-25
  • 打赏
  • 举报
回复
我自己写的代码 编译没错 但运行时有问题 print函数有点问题 a.print,b.print,c.print无法显示数据 谁知道怎么搞的

#include <iostream.h>
#include <string.h>

template <class T>
class Queue
{
int size; //队列空间大小,最大队列元素个数为size-1
int front,rear; //队列头、尾指针
T *queuePtr;
bool flag;//队列存储空间的头指针
public:
Queue(int=10); //构造函数,默认数组大小为10
~Queue() { delete []queuePtr; } //Queue的析构函数
bool EnQueue(T x); //入队操作:元素x入队
bool DeQueue(T &x); //出队操作,由x返回出队元素
void Print();
bool isEmpty();
bool isFull();
};
template <class T>
bool Queue<T>::isEmpty(){
return(front==rear&&flag==0);

}
template <class T>
bool Queue<T>::isFull(){
return(front==rear&&flag==1);

}
template <class T> Queue<T>::Queue(int s) //构造函数
{
size=s>0?s:10;
front=rear=0;
queuePtr=new T[size];
}
template <class T>
void Queue<T>::Print()
{
if (isEmpty()) return;//空队列,不打印
int i=front;
while (i!=rear)
{
cout<<queuePtr[i]<<" ";
i=(i+1)%size;
}
cout<<endl;
}

template <class T>
bool Queue<T>::EnQueue(T x) //入队
{
if (isFull())//队列满
{
cout<<"错误:队列已满,不能写入"<<x<<"!\n";
return false;
}
queuePtr[rear]=x; //改写原有元素
rear=(rear+1)%size;
flag=1;
return true;
}

template <class T>
bool Queue<T>::DeQueue(T& x) //出队
{
if(isEmpty()) //队列空
{
cout<<"错误:队列空,不能出队。\n";
return false;
}
x=queuePtr[front];
front=(front+1)%size;
flag=0;
return true;
}

class student
{
int id;
char name[12];
public:
void Set(int i,char *nm)
{ id=i;strcpy(name,nm); }
friend ostream& operator <<(ostream& os,student &rp);
};
ostream& operator <<(ostream &os,student &p)
{ //对student对象,重载运算符<<
cout<<p.id<<','<<p.name<<" ";
return os;
}
void main()
{
Queue<double> a(8);
int i,k=1;double d=1.5;
while (a.EnQueue(d++));
cout<<"当前队列a中的元素为:\n";a.Print();
cout<<"开头3个出队元素为:\n";
for (i=0;i<3;i++)
if (a.DeQueue(d)) cout<<d<<" ";
cout<<endl;
cout<<"当前队列a中的元素为:\n";a.Print();
Queue<int> b;
for (i=0;i<10;i++,k++)
b.EnQueue(k);
cout<<"当前队列b中的元素为:\n";b.Print();
cout<<"队列b的出队序列为:\n";
while (b.DeQueue(k)) cout<<k<<" ";
cout<<endl;
Queue<student> c(7);
student st;
char *nm[]={"Wang","Zhang","Huang","Zhou","Yang","Chen","Liu"};
int Id=1401050301;
for (i=0;i<7;i++)
{
st.Set(Id+i,nm[i]);
c.EnQueue(st);
}
cout<<"当前队列c中的元素为:\n";c.Print();
cout<<"队列c的出队序列为:\n";
while (c.DeQueue(st)) cout<<st<<" ";
cout<<endl;
}


代码如上
运行后print函数有点问题 a.print,b.print,c.print无法显示数据 谁知道怎么搞的
ricky9087 2009-06-24
  • 打赏
  • 举报
回复
只要把我给的代码改一下就行了,不需要重写的~
ricky9087 2009-06-24
  • 打赏
  • 举报
回复
虽然有点问题,但还是谢谢你了!
yang_e_2009 2009-06-22
  • 打赏
  • 举报
回复
lz随便看看吧

#include <iostream.h>
#include <string.h>
using namespace std;
template <class T>
class Queue
{
unsigned int size;
T *front;
unsigned int use_count;
public:
Queue(int s = 10):size(s>10 ? s : 10),front(new T[size]),use_count(0){}
inline T& operator [](const unsigned int index)const{ return *(front+index); }
~Queue() { delete [] front; }
bool EnQueue(T x);
bool DeQueue(T* x = NULL);
inline bool empty(){ return use_count == 0; }//判断是否空
inline bool full(){ return use_count == size; }//判断是否满
void Print();
};
template <class T>
void Queue <T>::Print()
{
for(T* iter = front; iter != front+use_count; ++iter)
cout << *iter <<" ";
if(!empty())
cout << endl;
}
template <class T>
bool Queue <T>::EnQueue(const T x) //入队
{
if (full())//队列满
return false;
*(front+use_count) = x; //改写原有元素
++use_count;
return true;
}
template <class T>
bool Queue <T>::DeQueue(T* x = NULL) //出队
{
if(empty()) //队列空
return false;
if(x != NULL)
*x = *front;
--use_count;
for(T* iter = front; iter != front+use_count; ++iter)
*iter = *(iter+1);
return true;
}
class student
{
unsigned int id;
char name[12];
public:
student(int i,const char *nm):id(i){ strcpy(name,nm); }
friend ostream& operator <<(ostream&,const student&);
};
ostream& operator <<(ostream &os,const student &p)
{
cout << p.id <<',' <<p.name <<" ";
return os;
}
void main()
{
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧