栈:我只需要记录,每一次push后数组的最后一个位置end和此时数组里实际装的个数num;如果end超过数组容量就显示满了;否则end++
pull时,就end--;如果num==0;则说明栈空了
队列也是一样,我只需要每次记录第一个位置start,和末尾元素的位置end,和此时元素个数num,pull时就start++;num++;
如果start正好等于容量,就start=0;即循环利用数组;当然num--;如果num==0;则为空;
push时,就end++;num满了就报错;否则end++,若end==容量,就使end=0;循环利用
//用数组结构实现队列
template<typename T>
struct my_queue {
int arr_size;
my_queue(int sz = 0) :arr_size(sz), start(0),end(0),num(0){
arr = new T[sz];
}
void push(T e) ;
T pull() ;
T& front() const;
T& front() ;
~my_queue() {
delete arr;
};
private:
T *arr;
size_t start;
size_t end;
size_t num;
};
template<typename T>
void my_queue<T>::push(T e)
{
if (num == arr_size) {
throw out_of_range("满了!!!");
}
else {
arr[end++] = e;
num++;
if (end == arr_size) end = 0;
}
}
template<typename T>
T my_queue<T>::pull()
{
if (num == 0)
{
throw out_of_range("空了!!!");
}
else {
T res = arr[start];
start++;
num--;
if (start == arr_size) start = 0;
return res;
}
}
template<typename T>
T& my_queue<T>::front() const
{
if (num == 0)
{
throw out_of_range("NOTHING");
}
else return arr[start];
}
template<typename T>
T& my_queue<T>::front()
{
if (num == 0)
{
throw out_of_range("NOTHING");
}
else return arr[start];
}
//用数组结构实现栈
template<typename T>
struct my_stack {
int arr_size;
my_stack(int sz = 0) :arr_size(sz), end(0),num(0){
arr = new T[sz];
}
void push(T e);
T pull() ;
T& front()const;
T& front() ;
~my_stack() {
delete arr;
};
private:
T *arr;
size_t end;
size_t num;
};
template<typename T>
T& my_stack<T>::front() const
{
if (num == 0)
{
throw out_of_range("NOTHING");
}
else return arr[end-1];
}
template<typename T>
T& my_stack<T>::front()
{
if (num == 0)
{
throw out_of_range("NOTHING");
}
else return arr[end-1];
}
template<typename T>
void my_stack<T>::push(T e)
{
if (end== arr_size) {
throw out_of_range("满了!!!");
}
else {
num++;
arr[end++] = e;
}
}
template<typename T>
T my_stack<T>::pull()
{
if (end == 0)
{
throw out_of_range("空了!!!");
}
else {
T res = arr[end--];
num--;
return res;
}
}