ACM学习历程18——stack堆栈容器
2016-08-26 20:59
387 查看
Stack堆栈容器是一种实现了先进后出的线性表,它的插入和删除操作只能在栈顶实现。前面的博文中已经说过了,容器适配器包括:queue、stack、priority_queue
这些适配器都是包装了vector、list、deque中某个顺序容器的包装器,将一些基础容器转换成自己的容器。值得注意的是,适配器没有提供迭代器,不能同时插入和删除多个元素。使用stack前需要引入<stack>头文件。
(一)stack堆栈容器对象的创建:
stack<类型>
对象:stack<int> s;
(二)stack常用的操作:
empty() 堆栈为空则返回真;
pop() 移除栈顶元素;
push() 在栈顶增加元素;
size() 返回栈中元素数目;
top() 返回栈顶元素。
(三)stack清空的方法:
某城市有一个火车站,有n节车厢从A方向驶入车站,按进站的顺序编号为1~n。现让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站C。在程序中输入车厢数目和出站的特定顺序,如果可以则输出Yes,否者输出No。
样例输入:
5
1 2 3 4 5
5
5 4 1 2 3
6
6 5 4 3 2 1
样例输出:
Yes
No
Yes
这些适配器都是包装了vector、list、deque中某个顺序容器的包装器,将一些基础容器转换成自己的容器。值得注意的是,适配器没有提供迭代器,不能同时插入和删除多个元素。使用stack前需要引入<stack>头文件。
(一)stack堆栈容器对象的创建:
stack<类型>
对象:stack<int> s;
(二)stack常用的操作:
empty() 堆栈为空则返回真;
pop() 移除栈顶元素;
push() 在栈顶增加元素;
size() 返回栈中元素数目;
top() 返回栈顶元素。
#include<iostream> #include<stack> using namespace std; int main() { stack<int> s; s.push(1); s.push(2); s.push(3); cout<<"size="<<s.size()<<endl; while(!s.empty()) { cout<<s.top()<<" "; s.pop(); } cout<<endl; return 0; }
(三)stack清空的方法:
while(s.empty()==false) s.pop();stack应用:
某城市有一个火车站,有n节车厢从A方向驶入车站,按进站的顺序编号为1~n。现让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站C。在程序中输入车厢数目和出站的特定顺序,如果可以则输出Yes,否者输出No。
样例输入:
5
1 2 3 4 5
5
5 4 1 2 3
6
6 5 4 3 2 1
样例输出:
Yes
No
Yes
#include<iostream> #include<fstream> #include<deque> #include<stack> using namespace std; int main() { int n,s,i; deque<int> inque; deque<int> outque; stack<int> sta; deque<int>::iterator p; while(cin>>n) { inque.clear(); for(i=0;i<n;i++) { cin>>s; //将出站的顺序写到inque中 inque.push_back(s); } //原序队列输出 outque.clear(); for(i=1;i<=n;i++) { outque.push_back(i); } //清空栈 while(!sta.empty()) { sta.pop(); } //flag标志,为1时可以正确出站,为0不可以 int flag=1; while(!inque.empty()) { if(sta.empty()) { sta.push(outque.front()); //outque.front(); } else { if(sta.top()==inque.front()) { sta.pop(); inque.pop_front(); } else if(sta.top()<inque.front()) { sta.push(outque.front()); outque.pop_front(); } else { flag=0; break; } } } if(flag==1) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } } return 0; }括号匹配问题:
#include<iostream> #include<string> #include<stack> using namespace std; int main() { int n; cin>>n; while(n--) { string s; cin>>s; stack<char> S; S.push('#'); for(int i = 0; i<s.size(); ++i) { if(s[i]-S.top()==1 || s[i]-S.top()==2) { S.pop(); } else S.push(s[i]); } if(S.size()==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
相关文章推荐
- ACM学习历程10——set集合容器
- ACM学习历程17——bitset位集合容器
- ACM学习历程11——Multiset集合容器的使用
- ACM学习历程13——multimap集合容器
- ACM学习历程6——Vector向量容器
- ACM学习历程15——list双向链表容器
- ACM学习历程19——queue队列容器与priority_queue优先队列容器
- ACM学习历程9——string基本字符系列容器
- ACM学习历程12——Map映照容器
- ACM学习历程—BestCoder 2015百度之星资格赛1002 列变位法解密(vector容器)
- ACM学习历程——POJ3295 Tautology(搜索,二叉树)
- ACM学习历程—HDU1392 Surround the Trees(计算几何)
- ACM学习历程——POJ 2376 Cleaning Shifts(贪心)
- ACM学习历程——HDU1331 Function Run Fun(锻炼多维dp的打表)
- ACM学习历程——HDU4814 Golden Radio Base(数学递推) (12年成都区域赛)
- ACM学习历程——UVA442 Matrix Chain Multiplication(栈)
- ACM学习历程——HDU 5014 Number Sequence (贪心)(2014西安网赛)
- ACM学习历程——HDU5017 Ellipsoid(模拟退火)(2014西安网赛K题)
- ACM学习历程——UVA127 "Accordian" Patience(栈, 链表)
- ACM学习历程——UVA 127 "Accordian" Patience(栈;模拟)