基于java的数据结构学习——数组实现的栈以及简单应用的 C++ 实现
源码:
//
// Created by PC-Saw on 2019/1/3.
//#ifndef DATA_STRUCTURE_ARRAYSTACK_H
#define DATA_STRUCTURE_ARRAYSTACK_H#include "Stack.h"
#include "MyArray.h"template<typename T>
class ArrayStack : public Stack<T> {private:MyArray<T>* array;public:ArrayStack(); // 无参构造ArrayStack(int capacity); // 有参构造~ArrayStack(); // 析构函数ArrayStack(const ArrayStack<T>& arr); // 拷贝构造ArrayStack<T> &operator= (const ArrayStack<T> arr); // 重载赋值操作符MyArray<T> &operator[](int index); // 重载[]操作赋//友元函数实现 重载输出 << 操作符friend ostream & operator << (ostream &out, ArrayStack<T> &obj){out << "ArrayStack size = " << obj.getSize() << ", Capacity = " << obj.getCapacity() << endl;out << "ArrayStack: [";for (int i = 0; i < obj.getSize(); ++i){out << obj.array->get(i);if (i != obj.getSize() - 1)out << ", ";}out << "] Top";return out;}//友元函数实现 输入 >> 操作符friend istream & operator >> (istream &in, ArrayStack<T> &obj){for (int i = 0; i < obj.getSize(); ++i) {in << obj.array[i];}if (!in){obj = new ArrayStack();}return in;}int getCapacity(); // 获取栈容量int getSize(); // 获取栈内元素个数bool isEmpty(); // 判断栈空bool isFull(); // 判断栈满void push(T t); // 元素压入栈T pop(); // 元素出栈T peek(); // 查看栈顶元素
};// 无参构造函数
template <typename T>
ArrayStack<T>::ArrayStack(){cout << "调用 ArrayStack() 构造" << endl;array = new MyArray<T>();
}// 有参构造
template <typename T>
ArrayStack<T>::ArrayStack(int capacity){cout << "调用 ArrayStack(int) 构造" << endl;array = new MyArray<T>(capacity);
}// 析构函数
template <typename T>
ArrayStack<T>::~ArrayStack(){cout << "调用析构函数" << endl;delete[] array;array = nullptr;
}// 拷贝构造
template <typename T>
ArrayStack<T>::ArrayStack(const ArrayStack<T>& arr){cout << "拷贝构造" << endl;array = new MyArray<T>(arr.getCapacity());array = arr;
}// 重载赋值操作符
template <typename T>
ArrayStack<T>& ArrayStack<T>::operator= (const ArrayStack<T> arr){cout << "调用 = 赋值操作" << endl;if (this->array != nullptr){delete[] this->array;this->array = nullptr;}this->array = new MyArray<T>(arr.getCapacity());for (int i = 0; i < arr.getSize(); ++i) {this->array[i] = arr[i];}return *this;
}// 重载[]操作赋
template <typename T>
MyArray<T>& ArrayStack<T>::operator[](int index){if (index < 0 || index > this->getSize() - 1)throw "索引非法!";return this->array[index];
}// 获取栈容量
template <typename T>
int ArrayStack<T>::getCapacity(){return array->getCapacity();
}// 获取栈内元素个数
template <typename T>
int ArrayStack<T>::getSize(){return array->getSize();
}// 判断栈空
template <typename T>
bool ArrayStack<T>::isEmpty(){return array->isEmpty();
}// 判断栈满
template <typename T>
bool ArrayStack<T>::isFull(){return array->isFull();
}// 元素压入栈
template <typename T>
void ArrayStack<T>::push(T t){array->pushBack(t);
}// 元素出栈
template <typename T>
T ArrayStack<T>::pop(){return array->removeBack();
}// 查看栈顶元素
template <typename T>
T ArrayStack<T>::peek(){return array->getBack();
}#endif //DATA_STRUCTURE_ARRAYSTACK_H