您的位置:首页 > 其它

HDOJ acm 1022 火车进站出站(栈系列)

2016-10-10 20:41 246 查看
#include<iostream>#include<string>#include<stack>using namespace std;int main(){int n;while (cin >> n){bool flag = false;char* pin = new char[5*n];char* pout = new char[5*n];int* data = new int[5*n];int k = 0;cin >> pin;cin >> pout;stack<char> car;for (int i = 0, j = 0; i <=n;){if (  (pin[j] != pout[i])){if (!car.empty() && car.top() == pout[i]){i++;data[k++] = 0;car.pop();}else{car.push(pin[j]);data[k++] = 1;j++;}}else if ((pin[j] == pout[i])){data[k++] = 1;data[k++] = 0;i++;j++;}if ((i >= n && (j >= n) && (car.empty()))){flag = true;break;}if ((car.size() >= n) && (pout[i] != car.top())){flag = false;break;}}if (flag == true){cout << "Yes." << endl;for (int i = 0; i < 2 * n; i++){if (data[i] == 1)cout << "in" << endl;elsecout << "out" << endl;}}elsecout << "No." << endl;cout << "FINISH" << endl;}return 0;}
/*
解题过程自我总结:
1:明白这不是简单的字符串的逆序,而是栈的运用。
2:思路类似于有两组火车等待出站,一组位于stack中,一组就是数组中还未进站的队列,通过与给定的此刻需要出站的火车进行比较,选择是哪一组的火车需要出站。
3:一开始只是简单地判定能否按给定顺序出站成功,没有in out标记。后来加上int[] data模拟是进站还是出站操作,值得注意的是,
当条件符合数组中还未进站的火车等于此刻需要出站的火车是,逻辑上是没有让这辆火车push to stack,只是把data[i]=1,data[i+1]=1,即设置成进站再出站。
4:以上过程完成后,是运行超时,明白需要把数组增大。接下来是答案错误,意识到没有注意的问题是,当我入站和出站给定的数字有不同时,即输入 1 1 0,会陷入死循环,
于是我加上了最后的一个if判断,思路即堆栈达到火车数量后,并且栈顶元素仍旧不符合给定的出站火车,那么退出循环,flag=false。
*/

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: