📜  门| GATE-CS-2002 |问题1(1)

📅  最后修改于: 2023-12-03 15:12:39.939000             🧑  作者: Mango

门 | GATE-CS-2002 |问题1

本题是GATE-CS-2002的问题1,主要考察了解算法和数据结构的基础知识、编程能力和时间/空间复杂度分析能力。

问题描述

给定一个初始值为0的寄存器,以及一系列的操作指令。每个指令由以下两个部分组成:

  • 操作符:INC(加一)或者DEC(减一)
  • 表达式:一个非负整数n,或者寄存器的值

在执行每个操作指令时,首先计算表达式的值,然后根据操作符的指令将该值加一或者减一,最后将计算后的值存储在寄存器中。

请编写一个程序,输入一系列的操作指令,并输出最终寄存器的值。

解题思路

我们可以用一个整数变量reg来表示寄存器的值,一行一行地读入指令并逐个执行。在执行指令之前,我们需要解析出操作符和表达式,并根据表达式计算出一个操作数。然后,根据操作符将操作数加或者减1,最后将计算后的值存储在寄存器中。

可以使用一个while循环读入指令,直到遇到一个“HALT”的操作指令,循环退出。每次读入一行指令后,我们可以使用C++的字符串流类istringstream将该行指令分成操作符符和表达式,并计算出操作数。然后,根据操作符将操作数加或者减1,并将计算后的值存储在寄存器中。最后,输出最终的寄存器的值即可。

代码实现
#include<iostream>
#include<sstream>
using namespace std;

int main()
{
    int reg = 0;
    string op;
    int val;

    while (cin >> op >> val) {
        if (op == "INC") {
            reg += 1;
            if (reg > 255) reg = 0;
        }
        else if (op == "DEC") {
            reg -= 1;
            if (reg < 0) reg = 255;
        }
        else if (op == "HALT") {
            cout << reg << endl;
            return 0;
        }
        else if (op == "JNZ" && reg != 0) {
            int pc = val - 1;
            for (int i = 0; i < pc; i++) {
                cin >> op >> val;
            }
        }
    }
    return 0;
}

此外,注意处理程序中可能出现的数组越界和空指针等异常情况,以及特殊指令JNZ的处理等。

时间/空间复杂度

注意到本程序是一般情况下的线性时间复杂度,空间复杂度为常数级别,即O(1)。但由于特殊指令JNZ能够导致程序的“跳转”,因此我们需要在最坏情况下假设JNZ指令能够执行n次,此时时间复杂度为O(n),空间复杂度为O(1)。