数据结构--动态栈

动态栈

总体表述

栈属于容器的一种。
不同于数组类容器,可以在容器的任意位置执行元素插入和删除,
栈容器只允许在尾部,又称栈顶,进行元素插入和删除。
栈属于操作受限的容器。

接口设计

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