【解题思路】
① 链表该学还是要学的,对链表还不熟悉的也可以尝试用数组来解题;
② 对题目要求的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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
 
发表评论 取消回复