题目

给定一个初始为空的栈(栈容量为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了

一些需要注意的问题:

  1. 要合理地处理了栈满和栈空的情况,输出了"FULL"和"EMPTY"。

  2. 注意!!!
    输出的第二行,题目说的不明确,给的测试样例也不明确。
    实际上要求把栈里剩下的元素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;
}
10-16 01:15