DotcppXF


私信TA

用户名:dotcpp0599925

访问量:2121

签 名:

层楼终究误少年

等  级
排  名 151
经  验 6163
参赛次数 0
文章发表 13
年  龄 0
在职情况 学生
学  校 华南理工大学
专  业 计算机科学与技术

  自我简介:

The sad truth is, not everyone will accomplish something great. Some of us may just have to find meaning in the little moments that make up life.


【解题思路】


        ① 链表该学还是要学的,对链表还不熟悉的也可以尝试用数组来解题;

        ② 对题目要求的3个操作,做对应的数组操作即可。



【1】将x物品插入到当前栏位右侧并挪至插入的栏位


        ① 假设 x 表示当前栏位,y 表示目前数组中物品的个数,在插入物品之前先对空的数组做一个初始化:


x=-1;                                // x不指向任何一个栏位
y=0;                                 // a[]中物品个数为0


        ② 若只有插入物品操作,其实只要不断地增加 x ,存入数组 a[] ,然后增加 y 就可以了:


scanf("%d",&a[++x]);                 // x的位置向后移1位,输入新的物品
y++;                                 // a[]中物品数量增加1个


        ③ 但由于有挪动栏位的操作,即 x 的位置不一定在队尾,也就是说有可能在数组的中间存入一个新的物品,那么就需要把 x 位置后面的位置空出来存放新的物品,后面的物品则整体往后移动一个位置:


for(int i=y;i>x+1;i--)               // 将[x+1,y-1]的物品都后移1位存放,变成放在[x+2,y]
    a[i]=a[i-1];
scanf("%d",&a[++x]);
y++;



【2】挪至右侧下一个栏位


        ① 这个好办,直接 x++ 就可以了,不过要判断一下边界:


if(x==y)                             // 数组a[]是从0位开始存放物品的,所以当x等于y时,x变回0
    x=0;
if(y==0)                             // 若数组中没有物品,x=-1,始终不指向任何一个栏位
    x=-1;



【3】将物品取出并挪至其右侧栏位


        ① 先取出物品,也就是输出 a[x] ,当然要考虑到 y=0 的情况,防止数组越界:


if(y>0)
    printf("%d\n",a[x]);


        ② 取出后挪至右侧栏位本质上就是将数组x位置后面的数全部向前移动1位,因为x位置已经空了:


for(int i=x;i<y-1;i++)               // 将[x+1,y-1]的物品都前移1位存放,变成放在[x,y-2]
    a[i]=a[i+1];
y--;


        ③ 挪完之后别忘了也要判断一下边界。



【注意事项】


        ① 整体移动位置时,起始位置和结束位置不要搞错;

        ② 注意边界的判断。



【参考代码】


#include<stdio.h>
  
int main(void)
{
    int a[10000],x=-1,y=0,n,m;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        if(m==1)                             // 将x物品插入到当前栏位右侧并挪至插入的栏位
        {
            for(int i=y;i>x+1;i--)
                a[i]=a[i-1];
            scanf("%d",&a[++x]);
            y++;
        }
        if(m==2)                             // 挪至右侧下一个栏位
            x++;
        if(m==3)                             // 将物品取出并挪至其右侧栏位
        {
            if(y>0)
            {
                printf("%d\n",a[x]);
                for(int i=x;i<y-1;i++)
                    a[i]=a[i+1];
                y--;
            }
        }
        if(x==y)
            x=0;
        if(y==0)
            x=-1;
    }
    return 0;
}


 

0.0分

2 人评分

  评论区