Ps.很好的一道对链表的练习题,第一次练习使用链表,也是发现了自己对链表实现很多不清晰的理解(一片WA声) b( ̄▽ ̄)d
题目:UVA-11988
题目描述:每个样例是一行无空格的字符串,模拟在电脑上打字,’[’ 代表光标移至开头,之后的字符串整体打印在开头,‘]’ 代表光标移至末尾,之后的字符正常在末尾打印。要求输出打印出来的字符
样例输入:This_is_a_[Beiju]_text
[[]][][]Happy_Birthday_to_Tsinghua_University
样例输出:BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University
分析:
首先这题用单纯数组存储来实现是肯定不行的,数组的插入需要把后面所有元素后移一位,会TLE,而链表就可以很灵活地插入了。
一开始理解错了题意,用了双向的链表,左右两边延伸,导致样例输入的“This_is_a_[Beiju]_text"的输出变成了“ujieBThis_is_a__text”。这里 ‘[’ 的意思应该是将从 ‘[’ 之后到下一个 ‘[ ’ 或 ‘]’ 之前的所有字符原顺序打印在开头,所有应该是单向链表的插入操作,把 '[’ 之后的字符挨个插入到head节点后面。
首先是用指针实现链表(一堆注释,给自己理解):
#include<iostream>
#include<string>
#include<cstdio>
#include<sstream>
using namespace std;
struct node
{
char ch;
node *next;
};
int main()
{
node *head, *tail, *p; //head 头节点,tail指向尾部(用于返回末尾)
string str; //指针p代表光标位置,每下一个字符都放在p节点(光标)之后
while (cin >> str) //读取一行
{
p = tail = head = new(node); //统一初始化,头节点并不用于存放元素
p->next = NULL;
stringstream ss