破損的鍵盤(Broken KeyBoard)Uva 11988

樣例輸入:[[]][][]Happy_Birthday_to_Tsinghua_University
樣例輸出:Happy_Birthday_to_Tsinghua_University


靜態鏈表的實現:(用結構體數組模擬鏈表)

using namespace std;

class StaticList
{
private:
	typedef struct stElem
	{
		char ch;
		int nNext;
	}Elem;
private:
	const static int MAX_LEN = 1000;
	Elem Next[MAX_LEN];
	int cur;
	int last;
public:
	StaticList(){ cur = last = 0; Next[0].ch = '#'; Next[0].nNext = -1; }
	int MoveFront();
	int MoveBack();
	void AddItem(char strNext, int nPos);
	char* GetString();
};

int StaticList :: MoveBack() {cur = last;}
int StaticList :: MoveFront() {cur = 0;}
char * StaticList :: GetString()
{
	char *pStr = new char[MAX_LEN];
	int nPos = 0;
	for(int i = 0; Next[i].nNext != -1; i = Next[i].nNext)
		pStr[nPos++] = Next[i].ch;
	pStr[nPos] = '\0';
	return pStr;
}

void StaticList :: AddItem(char ch, int nNext)
{
	Next[nNext] = Next[cur];

	Next[cur].ch = ch;
	Next[cur].nNext = nNext;
	if(last == cur) last = nNext;
	cur = nNext;
}

int main()
{
	char s[] = "This_is_a_[beiju]_text";
	//char s[] = "[[]][][]Happy_Birthday_to_Tsinghua_University";
	int len = sizeof(s)/sizeof(char);
	StaticList objList;

	for(int i = 0; i < len; ++i)
	{
		if(s[i] == '[')
			objList.MoveFront();
		else if(s[i] == ']')
			objList.MoveBack();
		else
			objList.AddItem(s[i], i+1);
	}
	cout<< objList.GetString();
}

動態鏈表的實現:

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

class DynamicList
{
private:
	typedef struct ST_Node
	{
		char word;
		struct ST_Node *pNext;
	}Node;
	
	void AllocHeadNode();
private:
	Node *pHead;	
	Node *pTail;	
	Node *pCur;
	string strWord;
public:
	const long MAX_LEN;
	DynamicList() : MAX_LEN(1024) { AllocHeadNode(); }
	DynamicList(long nMaxLen) : MAX_LEN(nMaxLen) { AllocHeadNode(); }
	//================
	string GetString();
	void AskAString();
	//================
	void AddItem(char ch);
	void Move2Head();
	void Move2Tail();
};

void DynamicList:: AllocHeadNode()
{
	Node *pHeadNode = new Node;
	pHeadNode->word = '#';
	pHeadNode->pNext = NULL;
	pHead = pTail = pCur = pHeadNode; 
}
void DynamicList:: Move2Head() { pCur = pHead; }
void DynamicList:: Move2Tail() { pCur = pTail; }
void DynamicList:: AddItem(char ch)
{
	Node *tmp = new Node;
	tmp->word = ch;
	tmp->pNext = pCur->pNext;
	pCur->pNext = tmp;

	if(pCur == pTail)
		pTail = pTail->pNext;
	pCur = pCur->pNext;
}
void DynamicList:: AskAString()
{
	char a[MAX_LEN];
	int nPos = 0;

	for(Node *tmp = pHead->pNext;tmp != NULL; tmp = tmp->pNext)
		a[nPos++] = tmp->word;
	a[nPos] = '\0';

	strWord = a;
}
string DynamicList:: GetString() { return strWord; }

int main()
{
	char str[] = "This_is_a_[beiju]_text";
	//char str[] = "[[]][][]Happy_Birthday_to_Tsinghua_University";
	//DynamicList objList(1024);
	DynamicList objList;

	for(char *pos = str; *pos != '\0'; ++pos)
	{
		if(*pos == '[')
			objList.Move2Head();
		else if(*pos == ']')
			objList.Move2Tail();
		else
			objList.AddItem(*pos);
	}
	
	objList.AskAString();
	cout<< objList.GetString() <<endl;
    return 0;
}

個人小結:

以上使用的都是單向鏈表,因爲題目有兩個特點:(1)它處於建立鏈表的階段,而不是鏈表建成之後,把裏面的元素拆下來再插入到鏈表中;(2)它只涉及頭尾的插入

所以用單向鏈表來實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章