心胸决定格局,眼界决定境界...

数组模拟链表关系

	//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
}

  

 

posted @ 2019-02-13 11:21  WELEN  阅读(117)  评论(0)    收藏  举报