写了if,else的嵌套,思路延续上题的解法,我也贴了代码。

主要还是靠i,j进行边界控制然后模拟,嵌套里面的if与else主要判断头页与尾页更换时的边界(即i,j代表的每页的1和4条),其他时候,都是连续页只需要判断key(即鼠标)是否到达i,j边界的外面,然后再更改页面的边界(即i,j的数值)。

供各位参考。

#include <iostream>
#include <bits/stdc++.h>
#include <stack>

using namespace std;

int main() {
    string com;//命令字符串
    int i, j, key, n;//i,j的数值代表处于本页的第1和4条,key是光标所在位置,n为歌曲数
    while (cin >> n >> com) {
        key = i = 1;//根据题意初始时key为第一条
        if (n < 4) j = n;//先判断歌曲数量,n<4则定义下边界j=n,且后续判断中不改变i,j
        else j = 4;//n>=4,j初始即为4
        int len = com.size();
        for (int k = 0; k < len; k++) {//遍历命令字符串
            if (com[k] == 'U') { //向上翻即为key数值减小
                key--;
                if (key < 1) {//光标向上越界,则到达尾页即n-3到n的歌曲页
                    key = n;
                    if (n > 4) {//只有歌曲数量>4,才更改i,j,<=4都不更改,只移动key
                        i = n - 3;
                        j = n;
                    }
                } else if (key + 1 == i && n > 4) {//n<=4,不更改i,j
                    i--;
                    j--;//光标到达i上面一条,则i,j同时向上移动
                }
            } else if (com[k] == 'D') { //向下翻即为key数值增加
                key++;
                if (key > n) {//光标向下越界,则到达首页即1到4的歌曲页
                    key = 1;
                    if (n > 4) {//只有歌曲数量>4,才更改i,j,<=4都不更改,只移动key
                        i = 1;
                        j = 4;
                    }
                } else if (key - 1 == j && n > 4) {//n<=4,不更改i,j
                    i++;
                    j++;//光标到达j下面一条,则i,j同时向下移动
                }
            }
        }
        while (i <= j) {//i,j为当前光标所在页的第1和4首歌,输出i到j即可
            cout << i << " ";
            i++;
        }
        cout << endl;
        cout << key << endl;//输出光标所在的歌曲条目
    }
}