题目
给定一个初始为空的栈(栈容量为10)和一系列进栈、出栈操作,请编写程序输出经过这些操作后栈的元素。栈的元素值均为整数。
输入格式
输入第1行为1个正整数n,表示操作个数;
第2行为给出的n个整数,非0元素表示进栈,此非0元素即为进栈元素,0元素表示出栈。
保证栈中元素个数不超过10个。
输出格式
第一行按出栈顺序输出所有出栈元素,以一个空格隔开;如果栈满时做进栈操作会输出"FULL”,如果栈空时做出栈操作会输出"EMPTY";
第二行中输出栈中所有元素,以一个空格隔开。
末尾均有一个空格。
输入样例
12
3 1 2 0 0 -1 0 0 0 4 5 0
输出样例
2 1 -1 3 EMPTY 5
4
思路
用C++的STL中的stack来模拟栈
以下是代码思路和一些要注意的问题🎈
首先要输入操作的次数n
使用一个stack来模拟栈的操作:
遍历操作序列:
如果操作不为0,就进行进栈操作 - > 如果栈已满,则输出"FULL"
如果操作为0,出栈操作,如果栈为空,则输出"EMPTY"
在遍历过程中,已经按出栈的顺序输出了元素或"FULL"/“EMPTY”。
**最后,**只需要用vector将栈中的剩余元素取出并反转,然后输出就ok了
一些需要注意的问题:
-
要合理地处理了栈满和栈空的情况,输出了"FULL"和"EMPTY"。
-
注意!!!
输出的第二行,题目说的不明确,给的测试样例也不明确。
实际上要求把栈里剩下的元素from 栈底 to 栈顶 输出 --> 可以用一个vector来暂存并反转输出
代码
#include<iostream>
#include<stack>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
stack<int> st;
int tmp = 0;
for(int i = 0;i<n;++i)
{
cin>>tmp;
if(tmp != 0)
{
if(st.size()== 10)//保证栈中元素个数不超过10个
{
cout<<"FULL ";
continue;//栈满了就继续,不可再push进栈了
}
st.push(tmp);
}
else
{
if(!st.empty())//判断是否为空
{
cout<<st.top()<<" ";
st.pop();
}
else
cout<<"EMPTY ";
}
}
cout<<endl;//要求输出分两行
//栈里剩余的元素从栈底到栈顶输出 -> 用vector来暂存并反转输出
vector<int> v;
while(!st.empty())
{
v.push_back(st.top());
st.pop();
}
reverse(v.begin(),v.end());//需要包含算法的头文件<algorithm>
for(auto c:v)
{
cout<<c<<" ";
}
return 0;
}