UVa11988 Broken Keyboard(练习链表使用)
Posted 曹孟德
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa11988 Broken Keyboard(练习链表使用)相关的知识,希望对你有一定的参考价值。
向量和数组的优势是可以随机的存取元素和在末尾添加删除元素,而当插入元素时,需要移动大量的数据,消耗大量的时间。而链表的优势是可以在O(1)删除和插入数据。所以在频繁移动元素时,可以使用链表。
分析:如果用一个数组来保存,题目中的文本随着光标位置的移动需不断的插入字符,这样会导致大量字符移动问题。解决方案是采用链表,将字符串保存在buf[1...n]中,然后用next[i]表示下标为i的字符的下一个位置的下标(链表不一定用指针实现)。为了方便起见,用一个虚拟的next[0]指向显示屏最右边的字符下标。再用cur表示光标的位置,即为光标在buf[cur]的右边.cur==0说明光标在显示屏的最左边。还用last表示显示屏最右边的字符。
#define _CRT_SECURE_NO_DEPRECATE #include <iostream> #include<string.h> #include <algorithm> using namespace std; const int maxn = 100000 + 5; char buf[maxn]; int Next[maxn]; int main(){ int cur, last,n; while (scanf("%s", buf+1)!=EOF){ n = strlen(buf + 1); cur = last = 0; for (int i = 1; i <= n; i++){ if (buf[i] == ‘[‘)cur = 0; //house键 else if (buf[i] == ‘]‘)cur = last; //end键 else{ Next[i] = Next[cur]; //字符i的下一个位置为cur的下一个位置 Next[cur] = i; //curr的下一个位置为i //更新cur和last if (cur == last)last = i; //cur等于i表示光标在显示屏最后一个字符 cur = i; //移动光标 } } Next[last] = 0; //结束位置 for (int i = Next[0]; i != 0; i = Next[i]) printf("%c", buf[i]); printf("\n"); } return 0; }
以上是关于UVa11988 Broken Keyboard(练习链表使用)的主要内容,如果未能解决你的问题,请参考以下文章
UVA 11988 Broken Keyboard (a.k.a. Beiju Text)
UVA——11988 Broken Keyboard (a.k.a. Beiju Text)
Uva 11988 Broken Keyboard STL+链表
Broken Keyboard (a.k.a. Beiju Text) UVA - 11988 (链表)