线性表的尾操作

题目来源:学堂在线_清华大学_JAVA程序设计进阶

 

题目描述:

如题。

给定一个线性表,如果你不知道什么是线性表,可以去看看数据结构。

当然,简单的说就是给一组数。

一共有如下5种操作:

1 index:查询第index位置上的数,如果index非法,则输出-1

2 value:将value插入到表的尾部

3 n v1 v2 ... vn:将v1到vn的n个数一次插入到表的尾部

4: 删除表尾的一个数,如果表是空的,则什么都不做

5 n: 删除表尾的n个数,如果表中没有n个数,则将表中的数全部删除

对每一个1指令,打印输出查询到的数值。

初始时,表是空的。

特别的,index从1开始,也就是说表首元素是第1个元素,而不是第0个。

本题出现的所有数据均是正的int类型。

本题的输入功能由系统完成,无需学员编写。

因此本题不提供输入输出样例,学员按照题目描述进行处理输出即可。

 

package chapter07.test01;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//表示指令的对象
class Cmd {
    int cmd;                //只能取值1~5
    int nOrIndexOrValue;    //cmd为1时,该域表示index
    //cmd为2时,该域表示value
    //cmd为3时,该域表示n
    //cmd为4时,该域忽略
    //cmd为5时,该域表示n
    Integer[] params;        //cmd为3时,该域含n个int
}

public class test01 {
    public static void main(String[] args) {
        Cmd[] commands = getCmd();//获取指令序列

        //学员需要自行定义数据编写代码完成题目指定的任务
        /***being your code here****/
        List<Integer> a = new ArrayList<>();
        for (Cmd cmd : commands) {
            switch (cmd.cmd) {
                case 1: {//输出
                    int idx = cmd.nOrIndexOrValue - 1;
                    if (0 <= idx && idx < a.size()) {
                        System.out.println(a.get(idx));
                    } else {
                        System.out.println("-1");
                    }
                }
                break;
                case 2: {//尾插入
                    int v = cmd.nOrIndexOrValue;
                    a.add(v);
                }
                break;
                case 3: {//尾插入多个数
                    for (int i : cmd.params) {
                        a.add(i);
                    }
                }
                break;
                case 4: {//尾删除
                    if (!a.isEmpty()) a.remove(a.size() - 1);
                }
                break;
                case 5: {
                    int n = cmd.nOrIndexOrValue;
                    while (!a.isEmpty() && n > 0) {
                        a.remove(a.size() - 1);
                        --n;
                    }
                }
            }
        }

        /***end your code****/
    }

    //生成指令序列,学员可以无视
    public static Cmd[] getCmd() {
        Scanner cin = new Scanner(System.in);
        A = cin.nextInt();
        B = cin.nextInt();
        M = cin.nextInt();
        X = cin.nextInt();
        cin.close();

        int n = get();
        Cmd[] ret = new Cmd[n];
        ret[0] = new Cmd();
        ret[0].cmd = 3;
        ret[0].nOrIndexOrValue = get();
        ret[0].params = new Integer[ret[0].nOrIndexOrValue];
        for (int i = 0; i != ret[0].nOrIndexOrValue; ++i) ret[0].params[i] = get();

        for (int i = 1; i != n; ++i) {
            Cmd cmd = new Cmd();
            cmd.cmd = get() % 5 + 1;
            switch (cmd.cmd) {
                case 1:
                case 2:
                    cmd.nOrIndexOrValue = get();
                    break;
                case 3:
                    cmd.nOrIndexOrValue = get();
                    cmd.params = new Integer[cmd.nOrIndexOrValue];
                    for (int j = 0; j != cmd.nOrIndexOrValue; ++j) cmd.params[j] = get();
                    break;
                case 4:
                    break;
                case 5:
                    cmd.nOrIndexOrValue = get();
                    break;
            }
            ret[i] = cmd;
        }
        return ret;
    }

    //学员可以无视
    private static int A, B, M, X;

    private static int get() {
        X = (A * X + B) % M;
        return X;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值