栈的用法详解

栈的用法详解

栈是一种先入后出(FILO)的数据结构。

利用数组模拟栈


#include <bits/stdc++.h>
using namespace std;
int stk[10005];
int end = 0;
void pop()
{
    stk[end] = 0;
    end--;
}
void push(int t)
{
    stk[end] = t;
    end++;
}
int main()
{
    for (int i = 0; i < 10005; i++)
    {
        stk[i] = 0;
    }
    while (cin.eof() == false)
    {
        char ch;
        cin >> ch;
        if (ch == 'P')
        {
            int t;
            cin >> t;
            push(t);
        }
        if (ch == 'O')
        {
            pop();
        }
        if (ch == 'Q')
        {
            for (int i = 0; i < end; i++)
                cout <<stk[i]<<" ";
            cout<<endl;
        }
    }
    return 0;
}


代码中,利用变量end维护栈底,正常情况下不能通过直接访问数组来获取栈中内容,但是这是数组,所以……

STL stack

#include <bits/stdc++.h>
using namespace std;
stack<int> st;
int main()
{
    for (int i = 0; i < 10; i++)
    {
        st.push(i);
    }
    cout << st.top() << endl;
    cout << st.size() << endl;
    cout << st.empty() << endl;
    st.pop();
    cout << st.size() << endl;
    cout << st.top() << endl;
    return 0;
}

经典的STL函数应用,输出为

9
10
0
9
8

其中可以发现st.empty()返回的是empty()?true:false,所以在实际应用上要记得改成!st.empty()


典型例题:洛谷P1427 小鱼的数字游戏

题目描述

小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 \(a_i\)(长度不一定,以 \(0\) 结束),记住了然后反着念出来(表示结束的数字 \(0\) 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。

输入格式

一行内输入一串整数,以 \(0\) 结束,以空格间隔。

输出格式

一行内倒着输出这一串整数,以空格间隔。

样例 #1

样例输入 #1

3 65 23 5 34 1 30 0

样例输出 #1

30 1 34 5 23 65 3

提示

数据规模与约定

对于 \(100\%\) 的数据,保证 \(0 \leq a_i \leq 2^{31} - 1\),数字个数不超过 \(100\)

#include <bits/stdc++.h>
using namespace std;
int stk[10005];
int end = 0;
void pop()
{
    cout << stk[end] << " ";
    stk[end] = 0;
    end--;
}
void push(int t)
{
    stk[end] = t;
    end++;
}
int main()
{
    /*
    int n;
    cin>>n;
    for (int i = 0; i <n;i++){
        cin>>stk[i];
    }
    reverse(stk,stk+n-1);
    for(int i = 0; i < n; i++){
        cout<<stk[i];
    }
    */
    // int n;
    // cin >> n;
    for (int i = 0; i < 10005; i++)
    {
        int t;
        cin >> t;
        if (t == 0)
            break;
        push(t);
    }
    for (int i = 0; i < end; i++)
    {
        pop();
    }
    return 0;
}
// stl_main
int main_stl()
{
    stack<int> st;

    for (int i = 0; i < n; i++)
    {
        int t;
        cin >> t;
        if (t == 0)
            break;
        st.push(t);
    }
    while (!st.empty())
    {

        cout << st.top() < " ";
        st.pop();
    }
    return 0;
}
posted @ 2022-10-01 20:12  SweepyZhou  阅读(81)  评论(0编辑  收藏  举报