数据结构实现 1.2:数组栈(C++版)
1. 概念及基本框架
栈 可以看做一种特殊的 数组 ,所以我使用第一节实现的 动态数组 来实现栈这种数据结构。当然,栈也可以通过其他方式来实现。因为该栈是通过动态数组实现的,所以称之为 数组栈 。
栈的结构如上图所示,可知栈的基本特性如下:
1.栈 有 栈顶 和 栈底 两端。
2.入栈 和 出栈 操作只能从 栈顶 进行。
3.后 入栈 的先 出栈 ,即 后进先出(Last In First Out),LIFO 。
还有一个隐含特性,栈可以自行 扩容(缩容),而不需要用户关心,很显然,动态数组已经满足了这个要求。
由此可见,栈的操作并不多,我使用了一个由 纯虚函数 构成的 抽象类 作为一个接口来定义这些操作。具体代码如下:
template <class T>
class Stack{
public:
virtual int size() = 0;
virtual bool isEmpty() = 0;
virtual void print() = 0;
//入栈操作
virtual void push(T num) = 0;
//出栈操作
virtual void pop() = 0;
//获得栈顶元素
virtual T peek() = 0;
};
下面只需要通过继承 抽象类,并且重写 纯虚函数 ,就可以完成 数组栈 的实现。数组栈类的框架如下:
template <class T>
class ArrayStack : public Stack<T>{
public:
ArrayStack(int len = initialLen){
Array<T> *p= new Array<T>(len);
arr = p;
}
...
private:
Array<T> *arr;
};
这个类内部定义一个动态数组类对象,为了保护数据,把它放在 private 部分,构造函数 ArrayStack 底层调用的就是 Array 的构造函数。用户在构造函数中也可以指定栈的大小。(默认是10)为了兼容更多类型,这里使用了泛型的概念。
2. 基本操作程序实现
2.1 入栈操作
template <class T>
class ArrayStack : public Stack<T>{
public:
...
//入栈操作
void push(T num){
arr->addLast(num);
}
...
};
入栈操作使用了动态数组的增加最后一个元素的操作来实现。这里动态数组内部已经提供了扩容操作。
2.2 出栈操作
template <class T>
class ArrayStack : public Stack<T>{
public:
...
//出栈操作
void pop(){
arr->removeLast();
}
...
};
出栈操作使用了动态数组的删除最后一个元素的操作来实现。这里动态数组内部已经提供了缩容操作。
2.3 查找操作
template <class T>
class ArrayStack : public Stack<T>{
public:
...
T peek(){
return arr->get(arr->size() - 1);
}
...
};
因为栈只能获得栈顶元素,所以这里的查找操作也非常简单。
2.4 其他操作
template <class T>
class ArrayStack : public Stack<T>{
public:
...
int size(){