破损的键盘(Broken KeyBoard)Uva 11988

来源:互联网 发布:php棋牌游戏源码 编辑:程序博客网 时间:2024/05/01 08:59

样例输入:[[]][][]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();elseobjList.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();elseobjList.AddItem(*pos);}objList.AskAString();cout<< objList.GetString() <<endl;    return 0;}

个人小结:

以上使用的都是单向链表,因为题目有两个特点:(1)它处于建立链表的阶段,而不是链表建成之后,把里面的元素拆下来再插入到链表中;(2)它只涉及头尾的插入

所以用单向链表来实现。

0 0
原创粉丝点击