数据结构 - 栈
栈和队列是两种重要的线性结构,从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表的子集。他们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,他们是和线性表大不相同的两类重要的的抽象数据类型。
栈的定义
栈(stack) 是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈低(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表(简称LIFO:Last in, First out.结构)。
栈的基本操作主要有:栈的初始化、判空、判满、取栈顶元素、在栈顶进行插入和删除。在栈顶插入元素称为 入栈,在栈顶删除元素称为出栈。
栈的使用
1.手写栈
代码实现:
#include<iostream>
using namespace std;
const int N=1e7;
struct stack {
int a[N];//声明数组模拟栈
int tt=0;//tt代表栈顶位置
bool empty() {//判断栈是否为空
return (tt)?0:1;//不为空返回1,否则返回0
}
void insert(int n) {//插入元素
a[tt++]=n;//将tt设为加入的元素
}
int front() {//返回栈顶
return tt?a[tt-1]:-1;//如果栈不为空,返回a[tt-1],否则返回-1表示栈空
}
void pop() {//删除操作
if(tt) --tt;//在栈不空的情况下直接将栈顶位置减一
}
int size() {
return tt;
}
} s;
int main() {//检查代码是否写错的方法
s.insert(1);//插入元素1
printf("%d %d %d\n",s.empty(),s.front(),s.size()); //输出s是否为空和s的顶元素
s.pop();//删除插入的元素
printf("%d %d %d\n",s.empty(),s.front(),s.size()); //再次输出s是否为空和s的顶元素
return 0;
}
在实现插入、输出、判空、返回元素个数、返回栈顶四个操作后,可以添加自己想要的操作(你自己发挥,这个我管不着)
比如:
void clear() {
tt = 0;
}
2.STL_stack (懒人的法宝)
使用 C++ 的 STL 库中的 stack 容器,可以非常容易的使用栈。
应先添加头文件 #include <stack>,头文件下面加上 using namespace std;,就可以使用了。
常用操作
push(x):将 x 入栈,时间复杂度为 O(1)O(1);
top():获得栈顶元素,时间复杂度为 O(1)O(1);
pop():弹出栈顶元素,时间复杂度为 O(1)O(1);
empty():检测栈内是否为空,时间复杂度为 O(1)O(1)。
size():返回 stack 内元素的个数,时间复杂度为 O(1)O(1)。
#include <cstdio>
#include <stack>
using namespace std;
int main() {
stack<int> stk;
for (int i = 1; i <= 5; ++i)
stk.push(i);// 将 i 逐个入栈
printf("%d\n", stk.top());//已知栈非空,获取栈顶元素
return 0;
}

浙公网安备 33010602011771号