栈
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
图解:(栈的物理模型可以抽象为单开口的桶状结构)
(因为栈是单开口的结构所以有着 先进后出 的特点)
初始化
使用数组来模拟栈的过程
定义一个变量来记录当前栈顶元素的下标
int stk[N], tt; // stk 模拟栈,tt 记录栈顶下标
基本操作
插入
"向栈内插入一个数"
操作步骤
栈顶下标 tt 增大,然后将值赋值到 stk[tt] 即可
图解:
代码表示:
void insert(int x){
stk[ ++ tt ] = x;
}
删除
"删除栈顶元素"
操作步骤
栈顶下标 tt 减小一位即可
图解:
代码表示:
void pop(){
tt --;
}
判断栈是否为空
操作步骤
直接判断 tt 是否为 0 即可,如果为 0,那么说明栈顶位置在 0,即说明栈为空。
代码表示:
bool Empty(){
if(tt == 0) return true;
return false;
}
取出栈顶元素的值
操作步骤
因为tt就是栈顶元素的下标,所以直接返回stk[tt]即可
代码表示:
int query(){
return stk[tt];
}
题目
题目链接
栈:https://www.acwing.com/problem/content/830/
AC代码
学算法就上AcWing!!!
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int stk[N], tt; // stk 模拟栈,tt 记录栈顶下标
void insert(int x)
{
stk[ ++ tt] = x;
}
void pop()
{
tt --;
}
bool empty()
{
if ( tt > 0 )
return false;
return true;
}
int query()
{
return stk[tt];
}
int main()
{
int t;
cin >> t;
while (t -- )
{
string op;
cin >> op;
if(op == "push"){
int n;
cin >> n;
insert(n);
}
else if(op == "pop")
pop();
else if(op == "empty")
{
if(empty())
cout << "YES" << endl;
else
cout << "NO" << endl;
}
else
{
cout << query() << endl;
}
}
return 0;
}