UVA 11988 - Broken Keyboard

UVA 11988 - Broken Keyboard

LAVI

解題觀念

Struct & Linked List

可以參考我的課程簡報:Struct & Linked List

題目敘述

你有一個破損的鍵盤,鍵盤上的所有鍵都可以正常工作
但有時 Home 鍵 ‘ [ ‘ 或者 End 鍵 ‘ ] ‘ 會自動按下
然而你並不知道鍵盤存在這一問題就繼續專心打稿子
當你開啟顯示器之後,展現在你面前的是一段悲劇的文字
現在你的任務是在開啟顯示器之前計算出這段悲劇文字

Input

每組資料佔一行,包含不超過 100000 個字元
輸入結束標誌為檔案結束符 EOF

1
2
3
// Sample Input
This_is_a_[Beiju]_text
[[]][][]Happy_Birthday_to_Tsinghua_University

Output

對於每組資料,輸出一行,即螢幕上的悲劇文字

1
2
3
// Sample Output
BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University

Solution Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<stdio.h>
#include<stdlib.h>

typedef struct list_node *list_pointer;

typedef struct list_node{

char data;
list_pointer link;

}ListNode;

int main(){
char str[100000+5];
ListNode *head, *tail, *now;

while(scanf("%s", str) != EOF){
int begin;

for(begin = 0; str[begin] != '\0'; begin++){
if((str[begin] != '[') && str[begin] != ']'){
ListNode *new = malloc(sizeof(ListNode));
new->data = str[begin];
new->link = NULL;
head = tail = now = new;
break;
}
}

int i;
for(i = begin+1; str[i] != '\0'; i++){
if(str[i] == '['){
now = NULL;
}
else if(str[i] == ']'){
now = tail;
}
else{
ListNode *new = malloc(sizeof(ListNode));
new->data = str[i];

if(now == NULL){
new->link = head;
head = now = new;
}
else if(now == tail){
new->link = NULL;
now->link = new;
tail = now = new;
}
else{
new->link = now->link;
now->link = new;
now = new;
}
}
}

ListNode *j;
for(j = head; j != NULL; j = j->link){
printf("%c", j->data);
}
printf("\n");
}
return 0;
}
On this page
UVA 11988 - Broken Keyboard