栈是先进后出,比实现更重要的是应用。如括号匹配、栈混洗、中缀表达式求值。本文先写Stack的实现。
从Vector派生的Stack
# pragma once
# include "Vector.h"
template <typename T>
class Stack : public Vector<T> //从Vector派生的栈
{
public:
void push(T const & val)
{
Vector<T>::insert(val, Vector<T>::size);
}
T pop(void)
{
return Vector<T>::elem[--Vector<T>::size];
}
T & top(void)
{
return Vector<T>::elem[Vector<T>::size - 1];
}
};
从List派生的Stack
template <typename T>
class Stack :public List<T>
{
public:
void push(T const & val)
{
List<T>::insertAsFirst(val);
}
T pop(void)
{
T tmp = List<T>::first()->data;
List<T>::remove(List<T>::first());
return tmp;
}
T & top(void)
{
return List<T>::first()->data;
}
};
总结
如果remove实现的时候返回值是被移除节点的data,则top和pop不用访问最底层的elem,直接return remove即可