栈:
- 基本的数据结构之一,特点是“先进后出”。
例如:
- 坐电梯时,先进电梯的,最后出来;
- 一盒泡腾片,最先放进盒子的药片位于最底层,最后被拿出来。
栈的有关操作:
例子 | 说明 |
a.push_back(100); | 定义栈,Type为数据类型,如int,float,char等。 |
s.push(item); | 把item放到栈顶。 |
s.top(); | 返回栈顶的元素,但不会删除。 |
s.pop(); | 删除栈顶的元素,但不会返回。 |
s.size(); | 返回栈中元素的个数。 |
s.empty(); | 检查栈是否为空,如果为空返回true,否则返回false。 |
例题:
- hdu 1062 翻转字符串。
- 例如,输入“olleh !dlrow”,输出“hello world!”。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n; char ch;
scanf("%d",&n); getchar();
while(n--){
stack<char> s;
while(true){
ch = getchar(); //一次读入一个字符
if(ch==' '||ch=='\n'||ch==EOF){
while(!s.empty()){
printf("%c",s.top()); //输出栈顶
s.pop(); //清除栈顶
}
if(ch=='\n'||ch==EOF) break;
printf(" ");
}
else s.push(ch); //入栈
}
printf("\n");
}
return 0;
}
爆栈问题
- 栈需要用空间存储,如果深度太大,
- 或者存进栈的数组太大,那么总数会超过系统为栈分配的空间,
- 就会爆栈,即栈溢出。
解决办法有两种:
- (1)在程序中调大系统的栈。依赖于系统和编译器。
- (2)手工写栈。
比较复杂的用到栈的习题:
- hdu 1237 “简单计算器”,逆波兰表达式。