栈(stack)

1、栈的介绍


        栈是一种后进先出(Last in first out, LIFO)的线性表,即后进入的先出来,其限制是只能在栈的一段进行插入和删除操作


2、栈的基本操作
        1、入栈:在栈顶插入一个元素
        2、出栈:弹出栈顶元素


3、C++ STL中的stack
        1、定义一个栈:
        stack<数据类型> 栈名;
        2、stack的成员函数:
        push(x);//栈顶加x,无返回值
        pop();//弹出栈顶,无返回值
        top();//返回栈顶
        empty();//返回栈是否为空,空栈返回true、1
        size();//返回栈元素的数量

        ```
        //例
        include<stack>
        stack<int> sta;
        sta.push(1);
        sta.push(2);
        sta.size();//2
        sta.top();//2
        sta.empty();//0
        sta.pop();
        sta.size();//1
        ```
4、出栈序列
        1.n个不同元素进栈,元素不同排列的个数为:  (1/(n+1)) * (   C   2n, n )
        2、当入栈序列固定时,任意给定一个出栈序列如何判断是否合法:

        ```
        //循环遍历出栈序列,对于出栈序列的每一个元素
        if(元素在栈里)
        {
            if(在栈里)
            {
                出栈;
            }
            else
            {
                说明出栈序列不合法;
            }
        }
        else//元素不在栈里
        {
            1、先持续入栈,直到当前元素在栈里
            2、出栈
        }
        //循环遍历后,没有不合法,那么就是合法
        ```

        ```
        #include<bits/stdc++.h>
        using namespace std;
        int main()
        {
            //例:入栈序列固定为1~n,输入一个出栈序列,判断是否合法
            bool mark[100001] = {};//下标元素在不在栈里
            int poped[100001] = {};//出栈序列
            stack <int> sta;
            int n = 0, x = 0;//x表示当前要入栈的数
            cin >> n;
            for(int i = 1; i <= n; i++)
            {
                cin >> poped[i];
            }
            for(int i = 1; i <= n; i++)
            {
                //判读poped[i]在不在栈里
                if(mark[poped[i]] == 1)
                {
                    if(poped[i] == sta.top())
                    {
                        sta.pop();
                        mark[poped[i]] = 0;
                    }
                    else
                    {
                        cout << "False";
                        return 0;
                    }
                }
                else
                {
                    while(mark[poped[i]] == 0)//持续入栈
                    {
                        sta.push(x);
                        mark[x] = 1;
                        x++;
                    }
                    sta.pop();
                    mark[poped[i]] = 0;
                }
            }
            cout<<"Ture";
            return 0;
        }

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值