栈
定义:
1.栈(stack)是一种特殊的线性数据结构,栈中的元素是按照入栈顺序线性的排列。
2.栈的结构如下图所示,仅允许在表的一端进行插入和删除运算,这一端被称为栈顶,相对地,把另一端称为栈底。
3.栈的特点是后进先出(LIFO,Last In First Out),即最后入栈的元素最先出栈。
栈的实现:
数组模拟(手工栈):
STL栈:
栈的应用:
接下来有的小盆友可能会问:“这玩意有啥用?没数组简便,运行还贼慢!”
其实在递归函数中,就是不断压栈弹栈的一个过程。
初识应用:
例题:
http://ybt.ssoier.cn:8088/problem_show.php?pid=1353
【题目描述】
假设一个表达式有英文字母(小写)、运算符(+,—,∗,/+,—,∗,/)和左右小(圆)括号构成,以“@@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YESYES”;否则返回“NONO”。表达式长度小于255255,左圆括号少于2020个。
【输入】
一行数据,即表达式。
【输出】
一行,即“YESYES” 或“NONO”
【输入样例】
2*(x+y)/(1-x)@
【输出样例】
YES
【提示】
【样例输入2】
(25+x)*(a*(a+b+b)@
【样例输出2】
NO
【代码】
这代码乍一看没什么问题,但是…………
又去洛古提交了显示“RE”,说明爆栈,但是这个栈怎么变大???????????????
于是换了种思路:
两边都AC了!!!
代码:
思路都差不多
#include<bits/stdc++.h> using namespace std; int main(){ string s; int top=0; getline(cin,s); for(int i=0;i<s.size()-1;i++){ if(s[i]=='(') top++; else if(s[i]==')') top--; if(top<0) break; } if(top!=0) cout<<"NO"; else cout<<"YES"; return 0; }
栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈