Train Problem I(栈的溢出理解+栈运用)

今天刷题时做了一道栈的题,我想把AC的代码再优化一下,再次提交WA了,WA使我快乐 ,debug后发现是栈溢出了,于是找了栈溢出的原因。

栈为什么会溢出?

对每个程序来说,栈能使用的内存是有限的,一般是 1M~8M,这在编译时就已经决定了,程序运行期间不能再改变。如果程序使用的栈内存超出最大值,就会发生栈溢出(Stack Overflow)错误,程序就崩溃了

这个就像木桶里的水,木桶的容量有限,水满了自然会溢出来。

那么,什么情况下才会发生栈溢出呢?

最常见的就是递归。每次递归就相当于调用一个函数,函数每次被调用时都会将局部数据(在函数内部定义的变量、参数、数组、对象等)放入栈中。

递归1000次,就会将1000份这样的数据放入栈中。这些数据占用的内存直到整个递归结束才会被释放,在递归过程中只会累加,不会释放

如果递归次数过多,并且局部数据也多,那么会使用大量的栈内存,很容易就导致栈溢出了。

在函数内部定义超大数组也会导致栈溢出,例如定义一个 1024 * 1024 的 int 类型的二维数组,就需要 4M 的内存,这在 VS/VC 下就会发生栈溢出。

边用边释放就可以防止栈溢出。

搞清楚栈溢出的话,就来小试牛刀吧。

开栈!

Train Problem I 来大栈一场

#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
bool step[100];  //标记"in"还是"out"

int main()
{
    int n;
    while(cin>>n && n)
    {
        getchar();
        string str,mod;
        cin>>str>>mod;
        stack<char> st;
 
        int k=0,i=0,j=0;
        for(; i<n; i++)
        {
            st.push(str[i]); //入栈,存到栈里
            step[k++]=1;
            
            while(!st.empty() && st.top()==mod[j])
            {
                st.pop();  //出栈,释放空间
                step[k++]=0;
                j++;
            }
        }
        
        if(st.empty()&&( i>=n || j>=n ))
        {
            cout<<"Yes."<<endl;
            for( i=0 ; i < k ; i++ )
            {
                if(step[i]) cout<<"in"<<endl;
                
                else cout<<"out"<<endl;
            }
        }
        
        else   cout<<"No."<<endl;
        
        cout<<"FINISH"<<endl;
        
    }
    return 0;
}

千万不要写成这样:

for(; i<n; i++)
{
    st.push(str[i]);
    step[k++]=1;
}

// 容易栈溢出,WA警告

while(!st.empty() && st.top()==mod[j])
{
    st.pop();
    step[k++]=0;
    j++;
}

以上就是今天的心得。
欢迎点赞与评论~
记得收藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值