hdoj-1022-c++

该博客主要介绍了一个使用C++解决编程竞赛题目的方法,涉及栈的数据结构。题目要求模拟火车车厢进站和出站顺序,作者强调理解题目中列车并非一次性全部进站的重要性。通过创建栈并逐个压入车厢,同时检查栈顶元素是否与预期出站顺序相符,从而实现模拟。当所有车厢按照正确顺序出站后,程序输出"Yes.",否则输出"No."。

题目理解的一个要点是进站并不是一次性进完的,否则就太简单了。可以进一部分,出一部分,再进一部分。。。直到满足出站顺序要求。

理解了题目后即可得知,是一个模拟栈的问题,则关键思路是每次push之后,检查top是否符合当前index指向 的out序列中的值,若相等则pop,否则继续push(每一步都要注意修改对应index)。

附代码:

#include <iostream>

#include <stack>

 

using namespace std;

 

int main(){

    int num,indexin,indexout,indexflag;

    char in[100],out[100];

    int f[100];

    stack<char> s;

    while(cin>>num>>in>>out){

        while(!s.empty())

            s.pop();

        

        memset(f,-1,sizeof(f));

        

        indexin = 0;

        indexout = 0;

        indexflag = 0;

        

        while(indexin<num){

            s.push(in[indexin]);

            f[indexflag]=0;

            indexflag++;

            while(!s.empty()&&s.top()==out[indexout]){

                s.pop();

                f[indexflag]=1;

                indexflag++;

                indexout++;

            }

            indexin++;

        }

        if(indexout!=indexin){

            cout<<"No."<<endl;

        }

        else{

            cout<<"Yes."<<endl;

            for(int i=0;i<sizeof(f);i++){

                if(f[i]==0)

                    cout<<"in"<<endl;

                else if(f[i]==1){

                    cout<<"out"<<endl;

                }

                else

                    break;

                }

            }

        cout<<"FINISH"<<endl;

        }

    return 0;

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值