# include<iostream>
using namespace std;
template <class T>
class SeqQueue{
private:
T* elements; //存放队列元素的数组
int rear,front; //队尾指针和对头指针
int maxSize; //队列可容纳的最大元素个数
public:
SeqQueue(int sz):rear(0),front(0),maxSize(sz){
elements=new T[maxSize];
}
~ SeqQueue(){ delete[]elements;} //析构函数
bool EnQueue(const T& x){ //进队函数
if(isFull()) return false;
else
elements[rear]=x;
rear=(rear+1)%maxSize; //加一再取余是为了rear指向队列最后一个元素(下标maxSize-1),再进一下标就到了0
return true;
}
bool DeQueue(T& x){
if(isEmpty()) return false;
else
x=elements[front];
front=(front+1)%maxSize;
return true;
}
bool getFront(T& x){
if(isEmpty()) return false;
else
x=elements[front];
return true;
}
void makeEmpty(){front=rear=0;} //把队置空
bool isEmpty(){ return (front==rear)?true:false; } //判断队空
bool isFull(){ return ((rear+1)%maxSize==front)?true:false; } //判断队满
int getSize(){ return (rear-front+maxSize)%maxSize; } //求队中元素个数
friend ostream& operator<<(ostream& ostr,SeqQueue<T>& Q); //输出运算符重载
};
template<class T>
ostream& operator<<(ostream& ostr,SeqQueue<T>& Q){
ostr<<"front="<<Q.front<<" "<<"rear="<<Q.rear<<endl;
for(int i=Q.front;i!=Q.rear;i=(i+1)%Q.maxSize)
ostr<<i<<": "<<Q.elements[i]<<endl;
return ostr;
}
请帮我解答一下
4 个解决方案
#1
那你主函数是什么??
#2
我想实现双端队列,继承循环队列的代码,以减少代码的重复编写。但是却遇到了以下问题,以下是我写的代码
1.SeqQueue.h
2.SeqDeque.h
3.主函数:
请帮我解答一下,谢谢!
1.SeqQueue.h
# include<iostream>
using namespace std;
template <class T>
class SeqQueue{
private:
T* elements; //存放队列元素的数组
int rear,front; //队尾指针和对头指针
int maxSize; //队列可容纳的最大元素个数
public:
SeqQueue(int sz); //构造函数
~ SeqQueue(){ delete[]elements;} //析构函数
bool EnQueue(const T& x); //进队函数
bool DeQueue(T& x); //出队函数
bool getFront(T& x); //取队头元素
void makeEmpty(){front=rear=0;} //把队置空
bool isEmpty(){return (front==rear)?true:false;} //判断队空
bool isFull(){return ((rear+1)%maxSize==front)?true:false;} //判断队满
int getSize(){return (rear-front+maxSize)%maxSize;} //求队中元素个数
friend ostream& operator<<(ostream& ostr,SeqQueue<T>& Q); //输出运算符重载
};
template<class T>
SeqQueue<T>::SeqQueue(int sz):rear(0),front(0),maxSize(sz){
elements=new T[maxSize];
assert(elements!=NULL); //断言机制:如果不满足括号内条件将终止程序的执行
}
template<class T>
bool SeqQueue<T>::EnQueue(const T& x){
if(isFull()) return false;
else
elements[rear]=x;
rear=(rear+1)%maxSize; //加一再取余是为了rear指向队列最后一个元素(下标maxSize-1),再进一下标就到了0
return true;
}
template<class T>
bool SeqQueue<T>::DeQueue(T& x){
if(isEmpty()) return false;
else
x=elements[front];
front=(front+1)%maxSize;
return true;
}
template<class T>
bool SeqQueue<T>::getFront(T& x){
if(isEmpty()) return false;
else
x=elements[front];
return true;
}
template<class T>
ostream& operator<<(ostream& ostr,SeqQueue<T>& Q){
ostr<<"front="<<Q.front<<" "<<"rear="<<Q.rear<<endl;
for(int i=Q.front;i!=Q.rear;i=(i+1)%Q.maxSize)
ostr<<i<<": "<<Q.elements[i]<<endl;
return ostr;
}
2.SeqDeque.h
# include"SeqQueue.h"
# include<iostream>
using namespace std;
template <class T>
class SeqDeque:public SeqQueue<T>{
private:
int front,rear;
int maxSize;
T *elements;
public:
SeqDeque(int sz){ //构造函数
SeqQueue<T>::SeqQueue(sz);
}
~SeqDeque(){ //析构函数
delete[]elements;
}
bool getHead(T& x){ //取队头
return SeqQueue<T>::getFront(x);
}
bool getTail(T& x); //取队尾
bool EnQueueHead(const T& x); //从队头进队
bool EnQueueTail(const T& x){ //从队尾进队
return SeqQueue<T>::EnQueue(x);
}
bool DeQueueHead(T& x){ //从队头出队
return SeqQueue<T>::DeQueue(x);
}
bool DeQueueTail(T& x); //从队尾出队
bool isEmpty(){ //判断队空
return (front==rear)?true:false;
}
bool isFull(){ //判断队满
return SeqQueue<T>::isFull();
}
void makeEmpty(){ //把队置空
front=rear=0;
}
int getSize(){ //求队列元素个数
return (rear-front+maxSize)%maxSize;
}
friend ostream& operator<<(ostream& ostr,SeqDeque<T>& D); //输出运算符重载
};
template <class T>
bool SeqDeque<T>::getTail(T& x){
if(isEmpty()) return false;
else{
x=elements[(rear-1+maxSize)%maxSize];
return true;
}
}
template <class T>
bool SeqDeque<T>::EnQueueHead(const T& x){
if(isFull()) return false;
else{
front=(front-1+maxSize)%maxSize;
elements[front]=x;
return true;
}
}
template <class T>
bool SeqDeque<T>::DeQueueTail(T& x){
if(isEmpty()) return false;
else{
rear=(rear-1+maxSize)%maxSize;
x=elements[rear];
return true;
}
}
template <class T>
ostream& operator<<(ostream& ostr,SeqDeque<T>& D){
ostr<<"front="<<D.front<<" "<<"rear="<<D.rear<<endl;
for(int i=D.front;i!=D.rear;i=(i+1)%D.maxSize)
ostr<<i+1<<": "<<D.elements[i]<<endl;
return ostr;
}
3.主函数:
# include"SeqDeque.h"
# include<iostream>
using namespace std;
int main (){
int a,n=5;
SeqDeque<int> D(10);
cout<<"please enter the date into Queue"<<endl;
while(n--){
cin>>a;
D.EnQueueTail(a);
}
cout<<D<<endl;
system("pause");
return 0;
}
请帮我解答一下,谢谢!
#3
还有,模板类不可以声明写在头文件而实现函数写在cpp文件里吗?
如果不写主函数的话编译器能编译通过,编译器显示:
添加主函数后,编译器显示:
可是就算把模板类的声明和实现都放在头文件里面,编译器还是不能通过,并显示:
这又是怎么回事呢?
如果不写主函数的话编译器能编译通过,编译器显示:
添加主函数后,编译器显示:
可是就算把模板类的声明和实现都放在头文件里面,编译器还是不能通过,并显示:
这又是怎么回事呢?
#4
问题解决了吗,下次回帖记得引用我的回复,否则我看不到
#1
那你主函数是什么??
#2
我想实现双端队列,继承循环队列的代码,以减少代码的重复编写。但是却遇到了以下问题,以下是我写的代码
1.SeqQueue.h
2.SeqDeque.h
3.主函数:
请帮我解答一下,谢谢!
1.SeqQueue.h
# include<iostream>
using namespace std;
template <class T>
class SeqQueue{
private:
T* elements; //存放队列元素的数组
int rear,front; //队尾指针和对头指针
int maxSize; //队列可容纳的最大元素个数
public:
SeqQueue(int sz); //构造函数
~ SeqQueue(){ delete[]elements;} //析构函数
bool EnQueue(const T& x); //进队函数
bool DeQueue(T& x); //出队函数
bool getFront(T& x); //取队头元素
void makeEmpty(){front=rear=0;} //把队置空
bool isEmpty(){return (front==rear)?true:false;} //判断队空
bool isFull(){return ((rear+1)%maxSize==front)?true:false;} //判断队满
int getSize(){return (rear-front+maxSize)%maxSize;} //求队中元素个数
friend ostream& operator<<(ostream& ostr,SeqQueue<T>& Q); //输出运算符重载
};
template<class T>
SeqQueue<T>::SeqQueue(int sz):rear(0),front(0),maxSize(sz){
elements=new T[maxSize];
assert(elements!=NULL); //断言机制:如果不满足括号内条件将终止程序的执行
}
template<class T>
bool SeqQueue<T>::EnQueue(const T& x){
if(isFull()) return false;
else
elements[rear]=x;
rear=(rear+1)%maxSize; //加一再取余是为了rear指向队列最后一个元素(下标maxSize-1),再进一下标就到了0
return true;
}
template<class T>
bool SeqQueue<T>::DeQueue(T& x){
if(isEmpty()) return false;
else
x=elements[front];
front=(front+1)%maxSize;
return true;
}
template<class T>
bool SeqQueue<T>::getFront(T& x){
if(isEmpty()) return false;
else
x=elements[front];
return true;
}
template<class T>
ostream& operator<<(ostream& ostr,SeqQueue<T>& Q){
ostr<<"front="<<Q.front<<" "<<"rear="<<Q.rear<<endl;
for(int i=Q.front;i!=Q.rear;i=(i+1)%Q.maxSize)
ostr<<i<<": "<<Q.elements[i]<<endl;
return ostr;
}
2.SeqDeque.h
# include"SeqQueue.h"
# include<iostream>
using namespace std;
template <class T>
class SeqDeque:public SeqQueue<T>{
private:
int front,rear;
int maxSize;
T *elements;
public:
SeqDeque(int sz){ //构造函数
SeqQueue<T>::SeqQueue(sz);
}
~SeqDeque(){ //析构函数
delete[]elements;
}
bool getHead(T& x){ //取队头
return SeqQueue<T>::getFront(x);
}
bool getTail(T& x); //取队尾
bool EnQueueHead(const T& x); //从队头进队
bool EnQueueTail(const T& x){ //从队尾进队
return SeqQueue<T>::EnQueue(x);
}
bool DeQueueHead(T& x){ //从队头出队
return SeqQueue<T>::DeQueue(x);
}
bool DeQueueTail(T& x); //从队尾出队
bool isEmpty(){ //判断队空
return (front==rear)?true:false;
}
bool isFull(){ //判断队满
return SeqQueue<T>::isFull();
}
void makeEmpty(){ //把队置空
front=rear=0;
}
int getSize(){ //求队列元素个数
return (rear-front+maxSize)%maxSize;
}
friend ostream& operator<<(ostream& ostr,SeqDeque<T>& D); //输出运算符重载
};
template <class T>
bool SeqDeque<T>::getTail(T& x){
if(isEmpty()) return false;
else{
x=elements[(rear-1+maxSize)%maxSize];
return true;
}
}
template <class T>
bool SeqDeque<T>::EnQueueHead(const T& x){
if(isFull()) return false;
else{
front=(front-1+maxSize)%maxSize;
elements[front]=x;
return true;
}
}
template <class T>
bool SeqDeque<T>::DeQueueTail(T& x){
if(isEmpty()) return false;
else{
rear=(rear-1+maxSize)%maxSize;
x=elements[rear];
return true;
}
}
template <class T>
ostream& operator<<(ostream& ostr,SeqDeque<T>& D){
ostr<<"front="<<D.front<<" "<<"rear="<<D.rear<<endl;
for(int i=D.front;i!=D.rear;i=(i+1)%D.maxSize)
ostr<<i+1<<": "<<D.elements[i]<<endl;
return ostr;
}
3.主函数:
# include"SeqDeque.h"
# include<iostream>
using namespace std;
int main (){
int a,n=5;
SeqDeque<int> D(10);
cout<<"please enter the date into Queue"<<endl;
while(n--){
cin>>a;
D.EnQueueTail(a);
}
cout<<D<<endl;
system("pause");
return 0;
}
请帮我解答一下,谢谢!
#3
还有,模板类不可以声明写在头文件而实现函数写在cpp文件里吗?
如果不写主函数的话编译器能编译通过,编译器显示:
添加主函数后,编译器显示:
可是就算把模板类的声明和实现都放在头文件里面,编译器还是不能通过,并显示:
这又是怎么回事呢?
如果不写主函数的话编译器能编译通过,编译器显示:
添加主函数后,编译器显示:
可是就算把模板类的声明和实现都放在头文件里面,编译器还是不能通过,并显示:
这又是怎么回事呢?
#4
问题解决了吗,下次回帖记得引用我的回复,否则我看不到