数据结构、算法与应用 习题5.3 p104
1### 2. L = (a,b,c,d,e) ... 做图
初始状态:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
a | b | c | d | e |
insert(0,f)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
f | a | b | c | d | e |
insert(3,g)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
f | a | b | g | c | d | e |
insert(7,h)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
f | a | b | g | c | d | e | h |
earse(0)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
a | b | g | c | d | e | h |
erase(4)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
a | b | g | c | e | h |
3. changeLength2D
二维数组的话要基于Array设计一个矩阵类,其中的每一行都是一个Array对象。
template <class T>
class ArrayMatrix: public Array{
void changeLength2D( int x, int len );
}
template <class T>
void ArrayMatrix::changeLength2D( int rowIndex, int len ){
checkIndex(x);
get(rowIndex).changeLength(len);
}
3. 构造函数
好像题目描述有问题。 我自己写的是提供一个是否自动扩容的参数。如果配置为不自动扩容则在超出的时候抛出异常。
enum class ARRAY_AUTO_CAPACITY
{
DISABLED = 0,ENABLED = 1
};
template <class T>
class Array{
public:
Array(int initCapacity = ARRAY_DEFAULT_CAPACITY, ARRAY_AUTO_CAPACITY autoCapacity = ARRAY_AUTO_CAPACITY::DISABLED);
void checkMax();
private:
ARRAY_AUTO_CAPACITY _autoCapacity = ARRAY_AUTO_CAPACITY::DISABLED;
}
template<class T>
inline void Array<T>::checkMax()
{
if (_size >= _capacity) {
switch (_autoCapcity)
{
case ARRAY_AUTO_CAPACITY::ENABLED:
changeCapacityTo(_capacity << 1);
break;
case ARRAY_AUTO_CAPACITY::DISABLED:
throw illegalInputData("Array is full.");
break;
default:
break;
}
}
}
5. trimToSize()
实际上就是改变数组长度, 长度为size或1。 这里我基于我改写的 changeCapacityTo()来实现,实际上是一回事。
复杂度是O(n)
void trimToSize(){
changeCapacityTo( _size>0 ? _size : 1 );
}
template<class T>
inline void Array<T>::changeCapacityTo(int newCapacity)
{
T* newElements = new T[newCapacity];
_capacity = newCapacity;
_size = newCapacity < _size ? newCapacity : _size;
for (int i = 0; i < _size; i++)
{
newElements[i] = _elements[i];
}
delete[] _elements;
_elements = newElements;
}
6. setSize
这一题,同样题目描述是有问题的。 见上一题changeCapacityTo()
7. 重载[]
T& operator[]( int n){
checkIndex(n);
return _elements[n];
}
8. 重载==
template<class T>
bool operator==( const Array<T>& targetArray ) const{
if( size()!= targetArray.size() ){
return false;
}
for( int i=0; i<size();i++ ){
if( get(i) != target.get(i) ){
return false;
}
}
return true;
}
9. 重载!=
template<class T>
bool operator!=( const Array<T>& targetArray ){
return !*this == targetArray;
}
10. 重载<
见8 . 其中!= 替换为>
最近回复