🍈前言
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈的基本特点为: 后进先出(LIFO-last in first out):最后插入的元素最先出来。就像生活中我们取放盘子,当一摞盘子在桌子上时候,我们总是会取最上边的盘子,同时,我们在放盘子时,也会放在最上面。同样这种机制也在我们浏览网页时也有出现,在我们浏览网页时,左上角的转到上一页就是这种,最近浏览的网站在最上层,当返回时,先取到最上层的地址,这样即实现了逐层后退。
进栈(push):线性栈中,进栈数据存储在last+1(last为未进栈时栈顶元素的下标)的位置;链式表中,待进栈节点指向head的后继节点,head指向待进栈节点。
出栈(pop):线性表中,栈顶的下标-1;链式栈中,head指向它后继节点的后继节点(head->next = head->next->next)。
取栈顶(top):线性表中,返回下标为last-1的一个数据;链式表中,返回 head 的后继节点的数据。
🥝栈的操作接口
操作接口 | 功能 |
---|---|
void push(T p) | 将元素p插入到栈顶(进栈) |
void pop() | 删除栈顶对象 |
bool top(T &p) | 成功得到栈顶元素返回true,并得到栈顶数据p |
bool isEmpty() | 判断栈是否为空 |
int size() | 得到栈的大小 |
🍇线性栈
使用线性结构数组来实现栈的操作。
🍍线性栈的定义
template<class T>
class SeqStack {
public:
T *data;
int maxSize{
}; //能存储的最大数据量
int last{
}; //当前存储的元素个数(并非元素下标)
public:
SeqStack(); //构造函数
SeqStack(SeqStack<T> &list); //拷贝构造函数
~SeqStack(); //析构函数
void reSize(); //增加空间大小
void push(T p); //进栈
void pop(); //出栈
bool top(T &p); //取栈顶
bool isEmpty(); //判断栈是否为空
int size(); //返回栈的大小
void print(); //打印顺序栈
void clear(); //清空顺序栈
void delete_link(); //摧毁顺序栈
};
🍋基本函数
//构造函数
template<class T>
SeqStack<T>::SeqStack() {
maxSize = 50; //初始最大存储量为50
last = 0;
data = new T[maxSize]; //给数组分配空间
if (data == NULL) //动态分配失败
{
cerr << "存储分配错误!" << endl;
exit(1);
}
}
//拷贝构造函数
template<class T>
SeqStack<T>::SeqStack(SeqStack<T> &list) {
maxSize = list.maxSize;
last = list