题目链接: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; }
原文地址:https://www.cnblogs.com/abszse/p/10331269.html
时间: 2024-10-08 13:46:48