数组模拟链表关系
//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
}


浙公网安备 33010602011771号