[关闭]
@iwktd981220 2017-12-03T13:55:34.000000Z 字数 1732 阅读 372

题目之火车站点

图灵题目


题目

从A地来编号为:1~n的火车,他们按顺序进入站点C(若留在站点,则他们的排列顺序类似于栈),输入一定的出站顺序,设计程序判断能否实现。

trainStation.jpg

样例:

数量 输入 判断
5 1-2-3-4-5 yes
5 5-4-1-2-3 no
6 6-5-4-3-2-1 yes

判断思路(正序尚未想到,此处无用):

  1. 对于第一个,可以进去以后立刻出来
  2. 对于第二个,由于要 5 先出来,则全部都要进去,由于 1在最里面,所以1不可以先于2``3出来
  3. 对于第三个,全部进去,以后按照顺序出来就好

实现工具:

设计思路://事实证明,实现的手段并不重要,最重要还是思路,所以说队列并不是重点。

全部进队列
(由于后面已经有了,这里全部删除了)

还是金胜比较厉害啊,一句就把这个问题的解决要点想出来了。
还是有点bug的。
(这段基本没用)

  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. int num;
  5. cin>>num;
  6. int array[num];
  7. bool flag = true;
  8. for (int i = 0; i < num; i++) {
  9. cin>>array[i];
  10. }
  11. for (int j = 1; j < num-1; j++) {
  12. if (array[j+1] > array[j] && array[j-1] > array[j]) {
  13. flag = false;
  14. }
  15. }
  16. if (flag) cout<<"success."<<endl;
  17. else cout<<"failed."<<endl;
  18. return 0;
  19. }

重新再构造模型:

  1. 获得出站的顺序,或者说直接就把它入栈O里面
  2. 获得O栈顶的数据,与入站E的第一个元素比较
  3. 若是相等,则出OE
  4. 若是不等,则将O的元素入站S

伪代码:

  1. get the sequence of the train
  2. while O is not empty
  3. if S.front == E.front && S.front
  4. S.pop
  5. E.pop
  6. else if O.front == E.front
  7. O.pop
  8. E.pop
  9. else
  10. x = O.front
  11. S.push(x)
  12. while S.front == E.front
  13. S.pop
  14. E.pop
  15. if S.isEmpty
  16. cout<<"success."
  17. else
  18. cout<<"failed."

代码:

  1. #include "stackClass_v2"
  2. #include "queueClass"
  3. #include <iostream>
  4. using namespace std;
  5. int main(int argc, char const *argv[]) {
  6. queue<int> O;
  7. Stack<int> E;
  8. Stack<int> S;
  9. int count = 0;
  10. int seq = 0;
  11. cin>>seq;
  12. while (seq) {
  13. int n = (seq - seq/10*10);
  14. O.push(n);
  15. seq /= 10;
  16. count++;
  17. }
  18. for (int i = 0; i < count; i++) {
  19. E.push(i+1);
  20. }
  21. while (!O.isEmpty()) {
  22. if (!S.isEmpty() && S.front() == E.front()) {
  23. S.pop();
  24. E.pop();
  25. }
  26. else if (!O.isEmpty() && O.front() == E.front()) {
  27. O.pop();
  28. E.pop();
  29. }
  30. else {
  31. int x = O.front();
  32. S.push(x);
  33. O.pop();
  34. }
  35. }
  36. while (!S.isEmpty() && S.front() == E.front()) {
  37. S.pop();
  38. E.pop();
  39. }
  40. if (S.isEmpty()) {
  41. cout<<"success.";
  42. }
  43. else cout<<"failed.";
  44. return 0;
  45. }

按照这个伪代码,终于写好啦!!!
以后写程序前先写伪代码吧233333333333

总结

  1. 写程序前先写伪代码有助于成功
  2. 对于stack以及queue等类,好像还有内在的bug,慢慢de
  3. 提高效率,学gdb!!!啊啊啊!!!
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注