// 【场景】栈操作
//     编写一个程序，演示栈（stack）的以下操作： 1）将一个元素压入栈顶。 2）从栈顶弹出一个元素。 3）获取栈顶元素的值。
#include <iostream>
#include <stack>

using namespace std;

template <typename T>
void print(stack<T> &s)
{
    cout << "当前栈中元素(按出栈顺序)打印如下: " << endl;
    // 先将栈转存到另一个临时栈中，临时栈的元素顺序和原栈相反
    // 临时栈用于打印，而不改变原栈的元素顺序
    stack<T> tmp = s; // 拷贝原来的栈，避免改变原栈
    while (!tmp.empty())
    {
        cout << tmp.top() << " ";
        tmp.pop();
    }
    cout << endl;
    cout << "------------------" << endl;
}

int main()
{
    stack<int> stk;
    stk.push(1);
    stk.push(2);
    stk.push(3);
    stk.push(4);
    stk.push(5);

    print(stk);

    cout << "从栈顶弹出一个元素: " << stk.top() << endl;
    stk.pop();
    print(stk);

    cout << "获取栈顶元素的值: " << endl;
    cout << stk.top() << endl;

    return 0;
}