【解题思路】
① 链表该学还是要学的,对链表还不熟悉的也可以尝试用数组来解题;
② 对题目要求的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 人评分
2005年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:530 |
数列排序 (C语言代码)浏览:858 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:603 |
输出正反三角形 (C语言代码)浏览:859 |
C语言训练-列出最简真分数序列* (C语言代码)浏览:658 |
printf基础练习2 (C语言代码)浏览:690 |
A+B for Input-Output Practice (III) (C语言代码)浏览:594 |
用筛法求之N内的素数。 (C语言代码)浏览:595 |
蛇行矩阵 (C语言代码)浏览:559 |
敲七 (C++代码)浏览:1119 |