前言:
你有没有这样的经历:
stack<int> st;
st.push(x)
st.pop()
st.size()......
当时,看见大佬们写的代码,我是一头雾水
这不是结构体才有的东西吗
这是啥?
???????
它是一个STL
叫做栈
也可以手写
我感觉手写更方便......
T1:栈是什么
我们假设有一条只有一人宽的死胡同
进来几个人
最左边的人想要出去
被第二个堵住了
第四个要出去
然而最后一个进来的可以第一个出去
由此可见,最早进入的最晚出,最晚进入的最早出
这就是栈
总结一下就是:
LIFO :后进先出(last in first out)
stack又是啥
这就不用多说了
就是栈嘛
stack <int> stk;
这又是啥
就是伟大的(bushi)STL
1: stk.push(x)
压入栈
这就是push()—————入栈
将一个元素压入栈
也叫进栈
2: stk.pop()
这个叫作出栈,也就是离开栈
3: stk.size()
它就是干这个的
统计栈内有多少个元素
4: stk.empty()
我就不画图了
它的作用跟stk.size() == 0是一样的
5: stk.top()
获取栈顶元素
但是不会弹出
手写方法
为什么我说手写它更方便呢
一个数组
一个tp
就够了!!!
对应的做法如下
stk.push(x)
++tp
a[tp] = x
______________________________
stk.pop()
--tp
______________________________
stk.size()
tp
______________________________
stk.empty()
tp == 0
______________________________
stk.top()
a[tp]
就是这么简单
该讲的讲完了
我们食用一些题目吧
例题1:括弧匹配检验
链接如下🔗
登录 - 沐枫OJhttps://www.mfstem.org/p/630这题的思路是
遇到左括号就入栈,右括号就检察栈顶是不是对应的左括号,不匹配则不成立,反之成立
最后判断栈是否空就可以了
空则成立,反之则不成立
代码如下
#include<bits/stdc++.h>
using namespace std;
char l[257],s[257];
int top;
int main(){
cin >> s;
for(int i = 0;s[i];++i){
if(s[i] == '(' || s[i] == '['){//左括号入栈
++top;
l[top] = s[i];
}
else if(s[i] == ']' && l[top] == '[')--top;//判断匹配
else if(s[i] == ')' && l[top] == '(')--top;
else{
cout << "Wrong";
return 0;
}
}
if(top)cout << "Wrong";//判断栈空
else cout << "OK";
return 0;
}
例题2: 车厢调度
他的读入顺序是1——n
所以我们只需要模拟进展和出栈就OK了
代码如下:
#include<bits/stdc++.h>
using namespace std;
int stk[1007],tp;
int main(){
int n,nx = 1,x;
scanf("%d",&n);
for(int i = 1;i <= n;++i){
scanf("%d",&x);
while(x > nx)stk[++tp] = nx++;//模拟入栈
if(x == nx){
++nx;
continue;
}
if(x != stk[tp]){//无法成立
cout << "NO";
return 0;
}
--tp;
}
cout << "YES";
return 0;
}
求点赞,求关注,我们下期再见。