破损的键盘(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)它只涉及头尾的插入

所以用单向链表来实现。

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