天天看点

C++数组实现队列、堆栈、模板类

  前面发现老师要求我们写一个堆栈、队列,但是我发现每一次都要修改数据类型,而且我在网上也没找到模板类,所以我就自己看了看模板类的知识,自己用数组写了一个,貌似使用起来没有什么问题。

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;

}
           

以上我只是在做作业的时候用过,可能会有其他问题,欢迎看到的朋友批评指正,感谢!