1. 程式人生 > >單鏈表--uva 11988 Broken Keyboard 從入門到放棄

單鏈表--uva 11988 Broken Keyboard 從入門到放棄

分析:

/*
思路:
用s陣列儲存字串;
用游標指定元素位置,下一個元素插入時在游標位置後面;
用next陣列記錄指向的下一個元素,在陣列上構建連結串列關係;
將游標在字串中移動,模擬輸出結果構建連結串列關係,最後根據連結串列將資料輸出。
注意:連結串列一般有個頭節點,可以將s[0]空出來對應頭節點。
*/
程式碼:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <stack>
#include <queue>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <bitset>
#include <list>
#include <sstream>
#include <set>
#include <functional>
using namespace std;

#define INF 0x3f3f3f3f
const int maxn = 1e5+5;
char s[maxn];
int Next[maxn];

int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	freopen("out.txt","w",stdout);
#endif
	while(scanf("%s",s+1) != EOF) {
		int cur = 0,last = 0;
		Next[0] = -1;//尾節點的next預設值,可以寫成-1,0,指標的話用的是null
	    int n = strlen(s+1);
	    for (int i = 1; i <= n; ++i){
	    	if(s[i] == '[') cur = 0;
	    	else if(s[i] == ']') cur = last;
	    	else{//根據游標位置插入元素
	    		Next[i] = Next[cur];//插入時元素連線游標元素後的連結
	    		Next[cur] = i;//游標元素連線插入元素
	    		if(cur == last) last = i;//正常插入時cur,last相等,插入後右移
	    		cur = i;//游標右移,更新位置
	    	}
	    }
	    for (int i = Next[0]; i != -1; i = Next[i]) printf("%c",s[i]);
	    printf("\n");
	}
}

參考:演算法競賽入門經典(劉大爺)第六章

ps:劉大爺的程式碼真簡潔,果然你大爺還是你大爺。