數據結構--動態棧

動態棧

總體表述

棧屬於容器的一種。
不同於數組類容器,可以在容器的任意位置執行元素插入和刪除,
棧容器只允許在尾部,又稱棧頂,進行元素插入和刪除。
棧屬於操作受限的容器。

接口設計

template <typename T>
class DynStack
{
public:
	DynStack();
	DynStack(const DynStack& sA_);
	DynStack operator=(const DynStack& sA_);
	~DynStack();

	void Push(const T& nNewValue_);
	T Pop();
	void Reset();
	T Peek(unsigned int nReverseIndex_ = 0) const;
	bool IsEmpty() const;
	int GetSize() const;
	Array::DynArray<T> GetArray() const
	{
		return m_arrValues;
	}
private:
	Array::DynArray<T> m_arrValues;
};

實現

構造

template <typename T>
DynStack<T>::DynStack()
{

}

拷貝構造

template <typename T>
DynStack<T>::DynStack(const DynStack& sA_)
{
	m_arrValues = sA_.m_arrValues;
}

賦值

template <typename T>
typename DynStack<T> DynStack<T>::operator=(const DynStack& sA_)
{
	m_arrValues = sA_.m_arrValues;
	return *this;
}

析構

template <typename T>
DynStack<T>::~DynStack()
{

}

插入

template <typename T>
void DynStack<T>::Push(const T& nNewValue_)
{
	m_arrValues.Add(nNewValue_);
}

刪除

template <typename T>
T DynStack<T>::Pop()
{
	if (IsEmpty())
	{
		throw "stack is empty";
	}

	int _nSize = m_arrValues.GetSize();
	T _nTopValue = m_arrValues[_nSize - 1];
	m_arrValues.DeleteByIndex(_nSize - 1);
	return _nTopValue;
}

查找

template <typename T>
T DynStack<T>::Peek(unsigned int nReverseIndex_) const
{
	if (IsEmpty())
	{
		throw "stack is empty";
	}

	int _nSize = m_arrValues.GetSize();
	if (nReverseIndex_ >= _nSize)
	{
		throw "the position to peek is not exist";
	}

	return m_arrValues[_nSize - 1 - nReverseIndex_];
}

時間複雜度

以下分析皆假設數組元素個數爲n

構造

時間複雜度Θ(1)

拷貝構造

時間複雜度Θ(n)

賦值

時間複雜度Θ(n)

析構

時間複雜度Θ(n)

插入

最壞下Θ(n),最壞情況爲插入元素觸發動態數組動態增加的情形。
其餘情形下,時間複雜度爲Θ(1)

刪除

最壞下Θ(n)

查找

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