在C++的容器适配器中直接有栈类型,也属于模板类,头文件为 <stack>
在严蔚敏版数据结构中,给栈分配了初始容量,且在入栈操作时加入了容量判断,若当前容量已满则再扩大容量空间。其中设定了两个指针,一个栈顶指针,一个栈底指针。栈顶指针用于返回出栈元素,始终指向栈顶元素的上方,栈底指针用于扩大容量和与栈顶指针相比较判空等操作。
以下为简单的栈操作,栈的模板类的表现形式:
#include <iostream>
using namespace std;
//创建栈模板类
template<class T>
class Stack
{
public:
Stack(unsigned int size = 100); // 预设定栈容量
~Stack();
void push(T); // 入栈操作
T top(); // 提取栈顶元素
void pop(); // 栈容量缩小,与上一步一般同步出现称为出栈操作
bool empty();
private:
unsigned int size; // 栈总容量
unsigned int size_now; // 栈当前容量,如有判空操作直接判断当前容量大小
T *data; // 使用数组形式开辟存储空间
};
// 模板类构造
template<class T>
Stack<T>::Stack(unsigned int size)
{
this->size = size;
data = new T[size]; // 开辟一定大小的空间
size_now = 0; // 在没有入栈操作时,当前容量为0
}
// 析构,释放
template<class T>
Stack<T>::~Stack()
{
delete[]data;
}
// 入栈操作
template<class T>
void Stack<T>::push(T value)
{
data[size_now++] = value; // 每入栈一个元素,当前容量+1
}
// 返回栈顶元素
template<class T>
T Stack<T>::top()
{
return data[size_now - 1];
}
// 栈容量 -1
template<class T>
void Stack<T>::pop()
{
size_now--;
}
// 判空
template<class T>
bool Stack<T>::empty()
{
if (size_now == 0)
return true;
else
return false;
}
/*
出栈操作可直接写成如下:
template<class T>
T Stack<T>::pop()
{
return data[--size_now];
*/
int main()
{
Stack<int> s;
for (int i = 0; i < 5; i++)
s.push(i);
for (int i = 0; i < 5; i++)
{
cout << s.top() << " ";
s.pop();
}
cout << endl;
return 0;
}