單鏈表--uva 11988 Broken Keyboard 從入門到放棄
阿新 • • 發佈:2019-01-25
分析:
/*
思路:
用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:劉大爺的程式碼真簡潔,果然你大爺還是你大爺。