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;
}