基本思想:
利用栈进行压栈,重新调整顺序。单纯利用栈输出的话无法快捷预知后续的节点首地址,计算索引非常麻烦;
关键点:
注意无效节点的统计;
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<vector> #include<string> #include<math.h> #include<algorithm> #include<cstring> #include<map> #include<queue> #include<set> #include<stack> using namespace std; const int maxn = 100000; int n,m,st; struct node { int st; int data; int ed; }; node vec[maxn]; vector<node>ls; int main() { stack<node>stk; cin >> st >> n >> m; int s; for (int i = 0; i < n; i++) { cin >> s; vec[s].st = s; cin >> vec[s].data >> vec[s].ed; } n = 0; int temp = st; while (temp != -1) { n++; temp = vec[temp].ed; } while (n >= m) { //当剩余数目足够时 for (int i = 0; i < m; i++) { //进行压栈操作; stk.push(vec[st]); st = vec[st].ed; } while (!stk.empty()) { node k = stk.top(); stk.pop(); n--; ls.push_back(k); } } if (n != 0) { while (st != -1) { ls.push_back(vec[st]); st = vec[st].ed; } } for (int i = 0; i < ls.size(); i++) { if (i != ls.size() - 1) { printf("%05d %d %05d\n", ls[i].st, ls[i].data, ls[i + 1].st); } else { printf("%05d %d -1\n", ls[i].st, ls[i].data); } } return 0; }