自己最近在学习清华大学邓俊辉教授的数据结构课程,不得不赞叹,邓老师出色的授课技巧,以及前人业已设计好的一系列算法和设计模式,使得我们解决问题的时候如鱼得水。在这里,我将数据结构Stack的实现过程贴出来,并在下面附上在编写代码的过程中遇到的问题。
#pragma once
#include"Vector.h"//以向量类,派生出模板类
template <typename T>
class Stack : public Vector<T>
{ //将向量的首/末端作为栈底/顶
public:
//size()、empty()以及其它开放接口,均可直接沿用
void push(T const& e)
{
//值得注意的是:由于insert接口业已在标准库中有其自己的实现,所以这里要显示的指明
//所调用的是那一个重载版本
Vector<T>::insert(e);
} //入栈:等效于将新元素作为向量的末元素插入
T pop()
{
return Vector<T>::remove(Vector<T>::size() - 1);
} //出栈:等效于删除向量的末元素
T& top()
{
return (*this)[Vector<T>::size() - 1];
} //取顶:直接返回向量的末元素
};
int main()
{
int i;
Stack<int>stk;
for (i = 0; i < 10; i++)
{
//进行100次入栈操作
stk.push(i);
}
cout << "-------------------01.取顶操作--------------------------------------------" << endl;
int top = stk.top();
cout << "the current top element of this stack is:" << top << endl;
cout << endl;
cout << "-------------------02.不断地弹栈,直到栈为空,并输出栈中的内容-------------" << endl;
while (!stk.empty())
{
cout << stk.top() << " ";
stk.pop();
}
cout << endl;
cout << endl << "test over!" << endl;
system("pause");
return 0;
}
我们需要学会善于利用面向对象等特点,避免重复的造轮子,因而这个版本的Stack模板类是基于此前业已实现并加以严密测试的Vector类进一步改造的,实际上对于一个栈结构的实现,即可以基于所谓的顺序存储结构(也就是这里所贴出的实现方式),又可以基于链表实现,另一种实现方式将在下一篇文章中给出。
在这段代码中有一个值得注意的点,那就是在调用父类的函数的时候最好显式的写明出来调用的是哪一个父类的函数,因为一个函数可能被多个父类甚至是库函数各自实现。比如下面的写法虽然麻烦,但是语义确是明确的:
1.Vector::insert(e);
2.Vector::remove(Vector::size() - 1);
3.(this)[Vector::size() - 1];