UVA11988 Broken KeyBoard

链表的思想很简单,要做到活用也不难。一般我是这样做得,从实际问题出发,先高度的概括符不符合链表的特点。能不能用链表简单解决。接着,就是编码。
链表编码要理清细节性思路,最好是简单的画下图,正如改题的链表,本质上是循环链表。last指向最后一个节点。其next指针一定指向头节点。我们把s[0]当做头节点。
 1 
 2 #include <cstdio>
 3 #include <cstring>
 4  const  int maxn = 100000 + 5;
 5  int last, cur, next[maxn];
 6  char s[maxn];
 7  int main() {
 8     
 9      while ( scanf("%s", s + 1) == 1) {
10         
11          int n = strlen(s + 1);
12         last = cur = 0;
13         next[0] = 0;  //  头结点初始化指向自身
14         
15          for ( int i = 1; i <=n; i++) {
16             
17              char ch = s[i];
18              if ('[' == ch ) cur = 0;
19              else  if (']' == ch) cur = last;
20              else {
21                 
22                 next[i] = next[cur];   //  next[cur]为当前光标的前一个字符,而next[i]就是当前光标要输入的字符,接着,光标还要跳到下个字符。所以我们要把当前字符next指向光标输入的字符。也就是next[cur] = i;但要先保存其next指针给输入字符。其next指针其实就是真相头结点。
23                 next[cur] = i;
24                  if (cur == last) last = i;
25                 cur = i;  //  指向下一个节点
26             }
27             
28         }
29         
30          for ( int i = next[0];i != 0; i = next[i]) {
31             printf("%c", s[i]);
32         }
33         puts("");
34     }
35     
36      return 0;
37 }

2015/4/12上午12:10:12

转载于:https://www.cnblogs.com/objectc/p/4553398.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值