数组模拟链表关系
//abscd[123]adf //输出abscd123adf //char s[1000]; //int next[1000]; //int cur = 0; //while (scanf("%s", s + 1) == 1) //{ // int len = strlen(s+1); // for (int i = 1; i <= len; i++) // { // if (s[i] != '[' && s[i] != ']') // { // next[cur] = i;//或者用next 直接保存非'[]'这些元素 // cur = i; // } // } // next[cur] = 0; // // for (int i = next[0]; next[i]; i = next[i])//next记录了下标之间的连接关系 // { // cout << s[i] << ","; // } // cout << endl; //} //abscd[123]adf //输出123abscdadf char s[1000]; int next[1000]; int cur = 0;//当前光标的位置,即下一步需要插入元素的位置 int last = 0;//屏幕的最右边 next[0] = NULL;//next[0] 一个虚拟表头 while (scanf("%s", s + 1) == 1)//返回的是变量的个数 { int len = strlen(s+1); for (int i = 1; i <= len; i++) { if (s[i] == '[')//移动光标回到虚拟头指针的位置,因为后面的元素需要插到表头后面 { cur = 0; } else if (s[i] == ']')//移动当前光标到当前cur 回到结尾 { cur = last;//当[]里面的元素插入完毕后,cur光标需要移动到屏幕的最右边,等待插入新的元素;此时cur和last又保持一致 } else { next[i] = next[cur];//i 指向 cur指向的旧链路 next[cur] = i;//cur 指向 新元素i 其实就是插入新元素i, i的右边和cur的旧链路联系起来,cur指向新元素i if (cur == last)//正常情况都相等,当出现'[',cur的位置发生变化,last不更新,始终指向屏幕的最右边 { last = i; } cur = i;//更新当前光标的位置 cur } } for (int i = next[0]; next[i]; i = next[i])//next记录了下标之间的连接关系 { cout << s[i] << ","; } cout << endl }