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;

}
以上我只是在做作業的時候用過,可能會有其他問題,歡迎看到的朋友批評指正,感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章