前面发现老师要求我们写一个堆栈、队列,但是我发现每一次都要修改数据类型,而且我在网上也没找到模板类,所以我就自己看了看模板类的知识,自己用数组写了一个,貌似使用起来没有什么问题。
1. 循环队列
template<class T>
class MyQueue
{
private:
int front;
int rear;
int size;
int maxSize;
T *ele;
public:
MyQueue(int max);
~MyQueue();
int Size();
int MaxSize();
int Find(T element);
int GetFrontIndex();
int GetRearIndex();
bool IsEmpty();
bool IsFull();
bool Push(T element);
bool Pop();
T GetFront();
T GetRear();
T operator[](int index);
};
template<class T>
MyQueue<T>::MyQueue(int max)
{
this->front=0;
this->rear=-1;
this->size=0;
this->maxSize=max;
ele=new T[max];
}
template<class T>
MyQueue<T>::~MyQueue()
{
delete []ele;
}
template<class T>
int MyQueue<T>::Size()
{
return size;
}
template<class T>
int MyQueue<T>::Find(T element)
{
int index=-1,temp=front;
if(!IsEmpty())
{
for(int i=0;i<size;i++)
{
if(ele[temp]==element)
{
index=temp;
break;
}
//如果temp走到数组头,则返回0,否则temp自增
if(temp==maxSize-1) temp=0;
else temp++;
}
}
return index;
}
template<class T>
bool MyQueue<T>::IsEmpty()
{
return size==0;
}
template<class T>
bool MyQueue<T>::IsFull()
{
return size==maxSize;
}
template<class T>
bool MyQueue<T>::Push(T element)
{
if(!IsFull())
{
if(rear==maxSize-1) rear=0;
else rear++;
ele[rear]=element;
size++;
return true;
}
else
return false;
}
template<class T>
bool MyQueue<T>::Pop()
{
if(!IsEmpty())
{
ele[front]=T();
if(front==maxSize-1) front=0;
else front++;
size--;
return true;
}
else
return false;
}
template<class T>
T MyQueue<T>::GetFront()
{
if(!IsEmpty())
{
return ele[front];
}
else
return NULL;
}
template<class T>
T MyQueue<T>::GetRear()
{
if(!IsEmpty())
{
return ele[rear];
}
else
return NULL;
}
template<class T>
T MyQueue<T>::operator[](int index)
{
return ele[index];
}
template<class T>
int MyQueue<T>::GetFrontIndex()
{
return front;
}
template<class T>
int MyQueue<T>::GetRearIndex()
{
return rear;
}
template<class T>
int MyQueue<T>::MaxSize()
{
return maxSize;
}
2. 堆栈
template <class T>
class MyStack
{
private:
int size; //堆栈的大小
int maxSize; //堆栈的最大容量
int top; //堆栈的栈顶元素
T *ele; //储存堆栈的的数组
public:
MyStack(int max);
~MyStack();
int Size();
int Find(T element); //是否找到该元素
bool Delete(int index);//删除某一元素,该元素上面的元素下移
bool IsEmpty();
bool IsFull();
bool Pop();
bool Push(T element);
T Top();
T operator[](int index);
};
template <class T>
MyStack<T>::MyStack(int max)
{
this->maxSize=max;
this->ele=new T[max];
this->size=0;
this->top=-1;
}
template <class T>
MyStack<T>::~MyStack()
{
delete []ele;
}
template <class T>
int MyStack<T>::Size()
{
return size;
}
template <class T>
int MyStack<T>::Find(T element)
{
int index=-1;
if(!IsEmpty())
{
for(int i=0;i<size;i++)
{
if(ele[i]==element)
{
index=i;
break;
}
}
}
return index;
}
template <class T>
bool MyStack<T>::Push(T element)
{
if(!IsFull())
{
ele[++top]=element;
size++;
return true;
}
else
return false;
}
template <class T>
bool MyStack<T>::Pop()
{
if(!IsEmpty())
{
ele[top]=T();
top--;
size--;
return true;
}
else
return false;
}
template <class T>
bool MyStack<T>::IsEmpty()
{
return size==0;
}
template <class T>
bool MyStack<T>::IsFull()
{
return size==maxSize;
}
template <class T>
T MyStack<T>::Top()
{
if(!IsEmpty())
return ele[top];
else
return NULL;
}
template<class T>
T MyStack<T>::operator[](int index)
{
return ele[index];
}
template<class T>
bool MyStack<T>::Delete(int index)
{
if(index>=0&&index<=size-1)
{
for(int i=index+1;i<size;i++)
{
ele[i-1]=ele[i];
}
ele[size-1]=T();
size--;
top--;
return true;
}
else
return false;
}
以上我只是在做作业的时候用过,可能会有其他问题,欢迎看到的朋友批评指正,感谢!