紫书例题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;
}

原文地址:https://www.cnblogs.com/abszse/p/10331269.html

时间: 2024-10-08 13:46:48

紫书例题6-4 (UVa 11988)的相关文章

紫书例题6-3 (UVa 442)

题目地址:https://vjudge.net/problem/UVA-442 题目大意:汗颜,其实我是直接看紫书的中文题意的,大意就是计算两个矩阵乘法次数,设计线性代数知识,可自己百度矩阵乘法. 思路:栈+模拟,左括号开始入栈,右括号开始计算栈顶两个矩阵的乘法次数然后再将新矩阵的n,m入栈即可. AC代码: #include <iostream> #include <string> #include <stack> #include <cstring> u

紫书例题6-7 树的层次遍历

纯小白也能看懂的代码,一起努力 6.3.2 二叉树的层次遍历 例题6-7 树的层次遍历(Trees on the level, Duke 1993, UVa 122) 输入一棵二叉树,你的任务是按从上到下.从左到右的顺序输出各个结点的值.每个结点都按照从根结点到它的移动序列给出(L表示左,R表示右).在输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格隔开.每棵树的输入用一对空括号"()"结束(这对括号本身不代表一个结点),如图6-3所示 注意,如果从根到某个叶结点的

【紫书】Oil Deposits UVA - 572 dfs求联通块

题意:给你一个地图,求联通块的数量. 题解: for(所有还未标记的'@'点) 边dfs边在vis数组标记id,直到不能继续dfs. 输出id及可: ac代码: #define _CRT_SECURE_NO_WARNINGS #include "stdio.h" #include<stdio.h> #include<algorithm> #include<string> #include<vector> #include<list&

第10章例题(紫书)

21/21 题目都很基础,有很多题书上讲得比较详细,然后隔得时间有点久,所以具体什么trick都忘了,思路也懒得去回忆,所以将就着放上来了.... 例题10–1 Uva 11582 题意:输入a, b, n让你计算F[a^b]%n;其中这个F[i]是斐波那契数: 题解: 这题是快速幂+找循环节,用什么方法找循环节呢?因为第一个数是0和1,然后当再出现0和1的时候就是出现循环节的时候,然后假如找到了循环节T,然后就有F[n] = F[n % T],预处理找循环节,O(一百万左右),快速幂logn

第11章例题(紫书)

10/15 这几天先专心刷一下图论的基础题目,也蛮多的,慢慢来... 例题11-1 uva 12219 题意:给你一个表达式,然后又一些子树在之前重复出现过,先要你给这些子树出现的顺序编个号1...N,然后如果重复出现就用编号替代,输出替代之后的表达式. 题解:这是一个表达式树的问题,显示建树,如果让我来写的话,很麻烦,搞不好复杂度是O(n^2),因为字符串是一直扫描下去的,所以就利用一个指针作为全局,然后一直扫下去,就忽略一个左括号,建左树,然后忽略逗号,建右树,忽略右括号,然后一直扫下去,就

UVA 11988 链表

之前遇到字典树什么的要不就用指针链表,要不直接上list. 数组链表主要思想和指针差不多. 指针是用*next记录下一个的地址然后形成链. 数组本身开辟空间时便是一个地址所以也可以达到这点. 比如 int a[11];     a[0]=1;   a[1]=2;  a[2]=4; a[4]=3; a[a[0]]=a[1]=2这样就达到了将 1 2 4 3 接到一起. 仔细分析一下数组a的下标再不断增大,但是记录的数据却在更新. 所以可以大致写出 int next[11]; int now=0;

紫书第4章 函数和递归

1  序 系统的整理下第四章的学习笔记.同上次一样,尽量在不依赖书本的情况下自己先把例题做出来.这次有许多道题代码量都比较大,在例题中我都用纯C语言编写,但由于习题的挑战性和复杂度,我最终还是决定在第五章开始前,就用C++来完成习题.不过所有的代码都是能在C++提交下AC的. 在习题中,我都习惯性的构造一个类来求解问题,从我个人角度讲,这会让我的思路清晰不少,希望自己的一些代码风格不会影响读者对解题思路的理解. 其实在第四章前,我就顾虑着是不是真的打算把题目全做了,这些题目代码量这么大,要耗费很

紫书第三章 数组和字符串

1  序 系统的整理下第三章的学习笔记.例题代码是在未看书本方法前自己尝试并AC的代码,不一定比书上的标程好:习题除了3-8百度了求解方法,其它均独立完成后,会适当查阅网上资料进行整理总结.希望本博文方便自己日后复习的同时,也能给他人带来点有益的帮助(建议配合紫书--<算法竞赛入门经典(第2版)>阅读本博客).有不足或错误之处,欢迎读者指出. 2  例题 2.1  UVa272--Tex Quotes #include <stdio.h> int main() { bool log

UAa 1339,紫书P73,词频

题目链接:https://uva.onlinejudge.org/external/13/1339.pdf 紫书P73 解题报告: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; int main() { //freopen("input.txt","r",stdin