情景引入
小 A 家住在一个小巷子里,这是一条死胡同,每天都有车停在死胡同里,小 A 发现,先停进去的车必须要等到新进来的车全部开走(即车在从外到内第一个)时,才能从胡同内出来。这个胡同便是常见的数据结构——栈
概念与示例
栈是一种操作受限的线性表,可以看作是一个特殊的数组,数组只能在末尾增加元素或删除元素
栈的修改与访问是按照后进先出的原则进行的,因此栈通常被称为是后进先出(last in first out)表,简称 LIFO 表
我们可以用一个普通数组模拟栈
int n,st[N],l,i;
cin>>n;
for(i=1;i<=n;i++){
int a;
cin>>a;
st[l++]=a;//压入元素
}
if(l!=0)l--;//弹出栈顶元素
while(l){
cout<<st[l]<<" ";//输出栈顶元素
l--;//弹出栈顶元素
}
标准的栈写法如下所示:
stack<int> st1,st2;//int表示栈内元素的数据类型
st1.push(1);//向栈顶压入元素1
st1.push(2)//向栈顶压入元素2
st2=st1;//将st1赋值给st2
st1.empty();//判断栈是否为空,是则返回true,不空则返回false
st1.pop();//弹出栈顶元素
cout<<st1.top();//输出栈顶元素
//此时应该输出1
属性和操作 | 数组模拟栈 | STL栈 |
---|---|---|
头文件 | 无 | #include |
定义 | int st[100], top = 0; // 栈大小为100 | stack stk; |
栈的大小 | int size = top - 0; | int size = stk.size(); |
栈为空 | top == 0 // 表示栈为空 | stk.empty() == true // 表示栈为空 |
取栈顶 | st[top] // 前置条件:栈不为空 top > 0 | stk.top() // 前置条件:栈不为空 top > 0 |
进栈 | st[++top] = t; // 将 t 入栈 | stk.push(t); // 将 t 入栈 |
出栈 | top–; // 前置条件:栈不为空 top > 0 | stk.pop(); // 前置条件:栈不为空 !stk.emtpy() |
清空栈 | top = 0; | stk = stack (); // 或 将一个空栈复制给 stk |
优点 | 运行速度快,使用灵活,可以遍历栈元素 | 定义方便,不用关心栈的大小限制 |
缺点 | 书写稍微麻烦 | 运行速度比手写栈慢一些,操作完全受限 |