紫书例题6-4 (UVa 11988)

题目链接:https://vjudge.net/problem/UVA-11988

题目大意:输入一串字符,并按照要求输出,遇到'['字符就将光标移动到开头,遇到‘]’字符就将光标移动到末尾。

思路:

  题目不难懂,很明显的一个模拟就行,重点是如何取存储,这里选择使用链表,链表的具体定义可以去百度看一下,这里不做过多解释,可以简单理解为一个未知长度的数组,它可以借助指针在任意位置插入(删除)。

  这题具体的操作可以用草稿纸模拟一遍,我是看一位博主的blog明白的,原blog地址:https://blog.csdn.net/u014800748/article/details/44729769

  具体我的思路其实和紫书上说的差不多,可以看代码上的注释。

AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

char ch[1000005];    //存储所输入的字符串
int s[1000005];      //这个int型的s字符串所代表的含义是你现在存储的字符下一个指向哪一个。

int main()
{
    while(scanf("%s",ch+1)==1)   //ch+1是将字符串存储在ch[1],ch[2]……ch[n]里,因为你的0位置必须得空出来,作为头指针的位置使用。
    {
        int num=0,last=0;        //num为指针现在所指位置,last为当前链表最后位置
        s[0]=0;                  //头指针初始化
        int len=strlen(ch+1);
        for(int i=1;i<=len;i++)
        {
            if(ch[i]==']')
                num=last;    //如果为']’,则指针移动到最后
            else if(ch[i]=='[')
                num=0;      //如果未'[',指针移动到头指针
            else
            {
                s[i]=s[num];    //这两句为插入语句,将当前元素插入到sum之后。
                s[num]=i;       //假设原来为0->sum->a,执行语句过程中为i->a,sum->i,链表更新为0->sum->i->a
                if(num==last) last=i;
                num=i;          //更新指针位置
            }
        }
        for(int i=s[0];i!=0;i=s[i])  //i初始化为头指针指向的位置,如果头指针指向0说明链表结束;i=s[i]是下一步到达当前i所指向的下一个元素
        {
            printf("%c",ch[i]);
        }
        printf("\n");
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/abszse/p/10331269.html