样例输入:[[]][][]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)它只涉及头尾的插入
所以用单向链表来实现。