HDU1022 Train Problem I (栈应用)

HDU1022 Train Problem I (栈应用)

原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=1022

题意

有一个站台,先进后出(就是栈),然后给一个数代表火车的个数,然后两个字符串分别代表进站顺序和出站顺序,问能否火车能否按照给定顺序进出站台,如果可以则给出火车进出站的方案。

思路

一道经典的关于栈应用的题目,主要的思路就是建一个栈代表火车站台,对进站和出站顺序分别设置索引index1和index2。如果栈为空,则按照进站顺序向栈中添加一个元素,并将index1向后+1,如果栈不为空,则判断栈顶元素是否是下一个出站的,若是则抛出并将index2+1,否则继续进栈,如果已经没有元素可以进栈了,同时栈顶元素不是下一个应该出栈的则表示没有解决方案。

AC代码

#include <bits/stdc++.h>

using namespace std;

/**
 *  Created with IntelliJ Clion.
 *  @author  wanyu
 *  @Date: 2018-02-27
 *  @Time: 20:45
 *  To change this template use File | Settings | File Templates.
 * 
 */
#define maxn 4000

int n;
char o1[maxn];//进站顺序
char o2[maxn];//出站顺序
bool ans[maxn];//解决方案,false代表出站,true代表进站
int x;

bool judge() {
    memset(ans, false, sizeof(ans));//初始化
    stack<char> stack1;
    int index1 = 0;//o1索引
    int index2 = 0;//o2索引
    x = 0;//ans索引
    while (index2 < n) {//不断循环,直到火车全部出站
        if (stack1.empty() || o2[index2] != stack1.top()) {//如果栈为空或栈顶元素与下一个出栈的元素不一致,则进栈
            if (index1 == n) {//如果已经没有火车可以入站了,但栈顶元素不是下一个应该出栈的则表示没有解决方案
                return false;
            }
            stack1.push(o1[index1++]);
            ans[x++] = true;
        } else {//栈顶元素与下一个出栈的元素一致,则出栈
            stack1.pop();
            ans[x++] = false;
            index2++;
        }
    }
    return true;
}

int main() {
    while (~scanf("%d", &n)) {
        scanf("%s", o1);
        scanf("%s", o2);
        if (judge()) {
            printf("Yes.\n");
            for (int i = 0; i < x; i++) {
                if (ans[i]) {
                    printf("in\n");
                } else {
                    printf("out\n");
                }
            }
            printf("FINISH\n");
        } else {
            printf("No.\nFINISH\n");
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值