基于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
?
?