1. 程式人生 > >靜態連結串列——UVA11988(破損鍵盤)

靜態連結串列——UVA11988(破損鍵盤)

開始刷資料結構相關的題了,在筆試和麵試過程中如果要寫出指標形式的連結串列時間上可能不夠。該題很好地訓練了怎麼使用陣列來模擬連結串列
破損的鍵盤(又名:悲劇文字)(Broken Keyboard(a.k.a. Beiju Text),
UVa 11988)
你有一個破損的鍵盤。鍵盤上的所有鍵都可以正常工作,但有時Home鍵或者End鍵會自
動按下。你並不知道鍵盤存在這一問題,而是專心地打稿子,甚至連顯示器都沒開啟。當你
開啟顯示器之後,展現在你面前的是一段悲劇的文字。你的任務是在開啟顯示器之前計算出
這段悲劇文字。
輸入包含多組資料。每組資料佔一行,包含不超過100000個字母、下劃線、字元“[”或
者“]”。其中字元“[”表示Home鍵,“]”表示End鍵。輸入結束標誌為檔案結束符(EOF)。輸
入檔案不超過5MB。對於每組資料,輸出一行,即螢幕上的悲劇文字。
樣例輸入:
This_is_a_[Beiju]_text
[[]][][]Happy_Birthday_to_Tsinghua_University
樣例輸出:
BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University

按照紫書中的講解,最簡單的想法便是用陣列來儲存這段文字,然後用一個變數pos儲存“游標位置”。這樣,輸入一個字元相當於在陣列中插入一個字元(需要先把後面的字元全部右移,給新字元
騰出位置)。很可惜,這樣的程式碼會超時。為什麼?因為每輸入一個字元都可能會引起大量字元移動。在極端情況下,例如,2500000個a和“[”交替出現,則一共需要0+1+2+…+2499999=6*1012次字元移動。解決方案是採用連結串列(linked list)。每輸入一個字元就把它存起來,設輸入字串是s[1~n],則可以用next[i]表示在當前顯示屏中s[i]右邊的字元編號(即在s中的下標)。
使用了一個next陣列來進行位置索引,用cur和last變數來記錄字串刪除起始點和終止點。最後輸出由i=Next[0]開始,i==0時作為停止條件,i = Next[i]作為每次迴圈的重新整理。

這裡提供兩幅圖來理解這個演算法,next數組裡面存的值是指向了下一次next陣列索引的序號以及這次我們在字串陣列s中索引到的值。第一幅是無’[’ ‘]’的情況

#include<iostream>
#include<cstring>
using namespace std;

const int maxn=30;

int main()
{
	char s[maxn];
	int i,len;
	int cur,last,next[maxn];//cur表示要輸入字元的上一個位置 
	while(cin>>(s+1))
	{
		cur=last=0;next[0]=0;
		            
		len=strlen(s);
		for(i=1;i<=len;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=i;
			} 
		}
		
		for(i=next[0];i!=0;i=next[i])
			cout<<s[i];
		cout<<endl;
	}
	return 0;
} 

相關推薦

靜態連結串列——UVA11988(破損鍵盤)

開始刷資料結構相關的題了,在筆試和麵試過程中如果要寫出指標形式的連結串列時間上可能不夠。該題很好地訓練了怎麼使用陣列來模擬連結串列 破損的鍵盤(又名:悲劇文字)(Broken Keyboard(a.k.a. Beiju Text), UVa 11988) 你有一個破損的鍵

UVA11988(破損鍵盤) 使用陣列模擬連結串列插入

  開始刷資料結構相關的題了,在筆試和麵試過程中如果要寫出指標形式的連結串列時間上可能不夠。該題很好地訓練了怎麼使用陣列來模擬連結串列   破損的鍵盤(又名:悲劇文字)(Broken Keyboard(a.k.a. Beiju Text), UVa 1198

實驗三:用雙鏈表、靜態連結串列以及間接定址實現基本的學生管理系統

實驗目的:鞏固線性表的資料的儲存方法和相關操作,學會針對具體應用,使用線性表的相關知識來解決具體問題。 實驗內容:建立一個由n個學生成績的線性表,n的大小由自己確定,每個學生的成績資訊由自己確定,實現資料的對錶進行插入、刪除、查詢等操作。 (1)用雙鏈表實現 源程式: #incl

資料結構實驗三靜態連結串列學生資訊

#include<iostream>   #include<string>   using namespace std;      //靜態連結串列的儲存結構   c

C++ 靜態連結串列基本演算法實現

C++ 靜態連結串列基本演算法實現 #ifndef StaticLinkList_h #define StaticLinkList_h const int MAXSIZE = 100; template <class T> struct StaticNode{ T data;

靜態連結串列的建立、插入、刪除···

#include"stdio.h" #include"stdlib.h" #define MAXSIZE 1000 bool flag=true; typedef struct MyStruct { int data; int cur; }stlist[MAXSIZE]; //初始化連結

學生成績——靜態連結串列

#include<iostream> #include<string> using namespace std; const int Maxsize=10; template<class student> class Node { pu

靜態連結串列設計一個學生管理系統

#include<iostream.h> struct Node {     int number; char* name; char* Class; float math_grade; int next; }Stu[10];

實驗三 用靜態連結串列實現學生成績管理系統

#include<iostream.h> #include<stdlib.h> typedef int ElemType; typedef int DataType; const int MaxSize=100; typedef struct { ElemType data

資料結構與演算法(三)-線性表之靜態連結串列

前言:前面介紹的線性表的順序儲存結構和鏈式儲存結構中,都有對物件地引用或指向,也就是程式語言中有引用或者指標,那麼在沒有引用或指標的語言中,該怎麼實現這個的資料結構呢? 一、簡介   定義:用陣列代替指標或引用來描述單鏈表,即用陣列描述的連結串列叫做靜態連結串列,這種描述方法叫做遊標實現法;  

Day4 —— 靜態連結串列的概念及基本操作的實現

靜態連結串列的概念及基本操作的實現 首先,先回顧一下靜態連結串列的概念 靜態連結串列是對於一些早期的程式設計高階語言沒有指標而出來的一種描述單鏈表的結構,它以陣列來代替指標,那麼它是怎麼構成的呢?接

實驗三順序表以及靜態連結串列

1.順序表的實現 #include<iostream.h>const int Maxsize=15;class ScoreList{public: void Insert(int i,int x); int Delete(int i); int Search(int x); void

C 語言例項4——建立簡單的靜態連結串列

為了建立連結串列 使head指向a節點,a.next指向b節點,b.next指向c節點這就構成了連結串列關係。 #include<stdio.h> struct Student { int num; float score; struct St

靜態連結串列插入和刪除操作詳解(C語言程式碼實現)

本節主要講解靜態連結串列的插入和刪除操作,有關靜態連結串列的詳細講解請閱讀《靜態連結串列及C語言實現》一文。 在講解靜態連結串列的插入和刪除操作之前,我們假設有如下的靜態連結串列: 圖中,array[0] 用作備用連結串列的頭結點,array[1] 用作存放資料的連結串列的頭結點,array[0]

線性表-靜態連結串列

靜態連結串列 用陣列來代替指標,來描述單鏈表 將陣列元素分成兩個資料域,data和cur。data用來存放資料元素,cur存放該元素的後繼在陣列中的下標(遊標)。<遊標實現法> 1.基本結構 /*線性表的靜態連結串列儲存結構*/ #define

133UVa救濟金髮放——靜態連結串列

注意:            while(used[idx1])                          idx1 = next[idx1];                    while(used[idx2])                        

靜態連結串列基礎

靜態連結串列 在沒有指標和類的早期程式語言(如Basic、Fortran等語言),為了實現連結串列,有人想到了拿陣列來代替指標,來描述單鏈表。 首先,我們讓陣列的元素都是由兩個資料域組成,data和cur,也就說,陣列的每個下標都對應了一個data和cur,而cur相當於單鏈表中的next指標, 存放該元

連結串列學習(一)靜態連結串列的構造

#include<stdio.h> typedef struct Student //宣告結構體型別 struct Student { int

線性表的清空與線性表的銷燬有什麼區別 靜態連結串列與陣列的區別

線性表的清空: bool SqList::ClearList() {  length=0;  return true; } 線性表的銷燬: bool SqList::DestoryList() {  delete []p;  p=NULL;     return true;

資料結構_靜態連結串列_哈夫曼

1、建立一棵二叉連結串列樹,分別輸出此先根,中根,後根遍歷序列(例如:輸入:ABDH##I##E##CF#J##G##) 2、將練習題程式設計,實現哈夫曼樹的構建和哈夫曼編碼設計(例如:輸入n=5,權值=0.12 0.40 0.15 0.08 0.25) #include&