1562. LVM
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
Description
You are designing a virtual machine for a new programming language called Lombok. The Lombok Virtual Machine (LVM) runs an assembler-like machine code. It operates on a stack and a single register.
In detail, the instructions work as follows:
PUSH x: This instruction pushes a given integer x onto the stack.
STORE: This instruction takes the topmost integer from the stack and stores it in the register.
LOAD: This instruction copies the content of the register and pushes it onto the stack.
PLUS: This instruction takes the two topmost integers from the stack, adds them, and pushes the resulting integer back onto the stack.
TIMES: This instruction takes the two topmost integers from the stack, multiplies them, and pushes the resulting integer back onto the stack.
IFZERO n: This instruction removes the topmost integer from the stack, and checks if it is equal to 0. If that is the case, it jumps to the n-th instruction (start counting at 0). If not, the machine continues as usual with the next instruction.
DONE: Finally, the DONE instruction prints out the integer on top of the stack, and terminates the program regardless of the following instructions.
Computation starts with the first instruction. Initially, the stack is empty and the register contains the number 0.
You can assume that the given program is correct; there will be no infinite loops, and the program will never attempt to remove an integer from an empty stack. You can assume that the stack does not grow bigger than 100, that the argument of PUSH is an integer not smaller than −10000 and not larger than 10000, and that the argument of IFZERO is an integer not smaller than 0 and not larger than 1000.
Input
The first line of the input contains an integer n between 2 and 1000, indicating the number of instructions of the program. The following n lines contain the program instructions. Arguments are separated by a space character from the preceding instruction.
Output
The output consists of a single line with an integer, which is the result of the first DONE instruction encountered during execution.
Sample Input
14 PUSH 5 STORE LOAD LOAD PUSH -1 PLUS STORE LOAD IFZERO 13 LOAD TIMES PUSH 0 IFZERO 3 DONE
Sample Output
120
// Problem#: 1562
// Submission#: 3259218
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <iostream>
#include <algorithm>
#include <string>
#include <stack>
using namespace std;
int main() {
std::ios::sync_with_stdio(false);
int N;
string order[1005];
int num[1005];
stack<int> s;
int re = 0;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> order[i];
if (order[i] == "PUSH" || order[i] == "IFZERO") cin >> num[i];
}
int step = 0;
while (1) {
if (order[step] == "PUSH") s.push(num[step]);
else if (order[step] == "STORE") {
re = s.top();
s.pop();
}
else if (order[step] == "LOAD") s.push(re);
else if (order[step] == "PLUS") {
int temp = s.top();
s.pop();
s.top() += temp;
}
else if (order[step] == "TIMES") {
int temp = s.top();
s.pop();
s.top() *= temp;
}
else if (order[step] == "IFZERO") {
if (s.top() == 0) {
s.pop();
step = num[step];
continue;
}
s.pop();
}
else if (order[step] == "DONE") {
cout << s.top() << endl;
break;
}
step++;
}
//getchar();
//getchar();
return 0;
}