标题:用c语言编写不知道怎么做,请大神们写下让我参考下,其中逆转和删除怎么写的 ...
只看楼主
w4654646
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2016-3-2
结帖率:76.47%
已结贴  问题点数:12 回复次数:9 
用c语言编写不知道怎么做,请大神们写下让我参考下,其中逆转和删除怎么写的
不少参赛同学刚学数据结构,对线性表最是熟悉不过。这里我们给线性表增加两个特殊的操作,第一个是‘R’ 操作,表示逆转整个表,如果表长为L,原来的第i个元素变成第L-i+1个元素。第二个操作是‘D’,表示删除表的第一个元素,如果表为空,则返回一个“error”信息。我们可以给出一系列的‘R’ 和‘D’组合,例如“RDD”表示先逆转表,然后删除最前面的两个元素。
 
本题的任务是给定表和一个操作串S,求出执行S后的表,如果中途出现‘D’操作于空表,输出“error”。
输入
 第一行是一个整数,表示有多少组数据。每组测试数据格式如下:
 
(1)第一行是操作串S,有‘R’ 和‘D’组成,S的长度大于0,不超过100 000。
(2)第二行是整数n,表示初始时表中的元素个数。n的值不小于0,不超过100 000。
(3) 第三行是包含n个元素的表,用‘[’ 和 ‘]’括起来,元素之间用逗号分开。各元素值在[1,100]之间。
输出
 对于每一组测试数据,输出执行S后的表(格式要求同输入)或者“error”。
 
 
样例输入
4
RDD
4
[1,2,3,4]
DD
1
[42]
RRD
6
[1,1,2,3,5,8]
D
0
[]
样例输出
[2,1]
error
[1,2,3,5,8]
error


[此贴子已经被作者于2016-6-22 09:25编辑过]

搜索更多相关主题的帖子: 线性表 c语言 信息 元素 
2016-06-22 09:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:12 
定义一个数组接受各元素([1,2,3,4])
定义一个表头,一个表尾,指向上面的头尾
如果遇到'R',表头和表尾的值调换一下;如果遇到'D',表头的值向表尾方向移动一格
2016-06-22 10:03
w4654646
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2016-3-2
得分:0 
回复 2楼 rjsp
哦 那能举个例子吗
2016-06-22 14:34
w4654646
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2016-3-2
得分:0 
或写下代码,我自已完善下
2016-06-22 14:37
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用w4654646在2016-6-22 14:37:35的发言:

或写下代码,我自已完善下
不怎么想写,因为输入格式和输出格式看起来很烂,需要浪费大量的时间在这些无聊的格式上
程序代码:
#include <stdio.h>

void foo( const char* opts, unsigned n, const unsigned elems[] )
{
    unsigned a = 0;
    unsigned b = n;
    unsigned r = 0;

    for( ; *opts; ++opts )
    {
        if( *opts == 'R' )
            ++r;
        else if( r%2 == 0 )
            ++a;
        else
            --b;
    }

    if( a > b )
        puts( "error" );
    else if( a == b )
        puts( "[]" );
    else if( r%2 == 0 )
    {
        printf( "[%d", elems[a++] );
        for( ; a!=b; ++a )
            printf( ",%u", elems[a] );
        puts( "]" );
    }
    else
    {
        printf( "[%d", elems[--b] );
        for( ; a!=b; --b )
            printf( ",%u", elems[b-1] );
        puts( "]" );
    }
}

int main( void )
{
    unsigned count;
    scanf( "%u", &count );
    while( count-- )
    {
        char opts[100001];
        unsigned elems[100001];
        unsigned n;

        scanf( "%s", opts );
        scanf( "%u %*c", &n );
        for( unsigned i=0; i!=n; ++i )
            scanf( "%u %*c", elems+i );

        foo( opts, n, elems );
    }

    return 0;
}

你看,有用的代码就
    for( ; *opts; ++opts )
    {
        if( *opts == 'R' )
            ++r;
        else if( r%2 == 0 )
            ++a;
        else
            --b;
    }
这么一点点,却不得不写大量垃圾代码,所以说这题出得不好
2016-06-22 15:23
w4654646
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2016-3-2
得分:0 
回复 5楼 rjsp
原来是这样,谢谢了
2016-06-22 15:49
w4654646
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2016-3-2
得分:0 
还有谁大神能写下别的代码让我参考下吗?
2016-06-22 15:55
w4654646
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2016-3-2
得分:0 
以下是引用rjsp在2016-6-22 15:23:15的发言:

不怎么想写,因为输入格式和输出格式看起来很烂,需要浪费大量的时间在这些无聊的格式上
#include  
 
void foo( const char* opts, unsigned n, const unsigned elems[] )
{
    unsigned a = 0;
    unsigned b = n;
    unsigned r = 0;
 
    for( ; *opts; ++opts )
    {
        if( *opts == 'R' )
            ++r;
        else if( r%2 == 0 )
            ++a;
        else
            --b;
    }
 
    if( a > b )
        puts( "error" );
    else if( a == b )
        puts( "[]" );
    else if( r%2 == 0 )
    {
        printf( "[%d", elems[a++] );
        for( ; a!=b; ++a )
            printf( ",%u", elems[a] );
        puts( "]" );
    }
    else
    {
        printf( "[%d", elems[--b] );
        for( ; a!=b; --b )
            printf( ",%u", elems1] );
        puts( "]" );
    }
}
 
int main( void )
{
    unsigned count;
    scanf( "%u", &count );
    while( count-- )
    {
        char opts[100001];
        unsigned elems[100001];
        unsigned n;
 
        scanf( "%s", opts );
        scanf( "%u %*c", &n );
        for( unsigned i=0; i!=n; ++i )
            scanf( "%u %*c", elems+i );
 
        foo( opts, n, elems );
    }
 
    return 0;
}
你看,有用的代码就
    for( ; *opts; ++opts )
    {
        if( *opts == 'R' )
            ++r;
        else if( r%2 == 0 )
            ++a;
        else
            --b;
    }
这么一点点,却不得不写大量垃圾代码,所以说这题出得不好
这我试了运行  结果是Segmentation fault:段错误,检查是否有数组越界,指针异常,访问到不应该访问的内存区域,这怎么了?
2016-06-22 16:23
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用w4654646在2016-6-22 16:23:09的发言:

这我试了运行  结果是Segmentation fault:段错误,检查是否有数组越界,指针异常,访问到不应该访问的内存区域,这怎么了?
类似的情况,你得告诉别人你输入了什么,否则怎么再现bug?
2016-06-23 08:31
w4654646
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2016-3-2
得分:0 
以下是引用rjsp在2016-6-23 08:31:05的发言:

类似的情况,你得告诉别人你输入了什么,否则怎么再现bug?
怎么告诉?
2016-06-23 08:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-466229-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.159540 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved