Quay lại danh sách thử thách
Khó 0 đã giải Tỷ lệ chấp nhận 0%

Mini Stack-Language Interpreter

Evaluate a small stack language.

Đề bài

Evaluate a small stack language. The stack starts empty; integers push values onto its top. Return the final stack from bottom to top. Tokens are separated by spaces and command names are case-insensitive.

Arithmetic +, -, *, / pops the top value as right operand and the next as left operand, then pushes left operator right. Division truncates toward zero. DUP copies the top value; DROP removes it; SWAP exchanges the top two; OVER copies the second-from-top value onto the top.

Define a word with : name body ;. A name contains only letters. The nonempty body may contain integers, built-in commands, and previously defined words. Definitions do not execute their bodies. Redefining a name affects later uses, but older definitions keep the meanings captured when they were defined. A definition may use the previous version of its own name. Nested definitions, forward references, and recursive calls are not allowed.

Every test program is valid: no unknown word, stack underflow, division by zero, or overflow occurs. You do not need to report errors.

Implement mini_stack_language_interpreter(program).

Input

program: The complete valid program.

Output

Return the final stack in bottom-to-top order.

Ràng buộc

0…10,000 tokens. At most 100,000 primitive tokens across all expanded definitions and executed code. Values and intermediate arithmetic fit signed 64-bit. Integer literals use optional minus followed by digits. Tokens : and ; are separate. Built-in names cannot be redefined; user words can be redefined. Empty input returns an empty stack.

Ví dụ

Ví dụ 1
Đầu vào:
program = ": square dup * ; 5 square 3 +"

Kết quả mong đợi:
expected = [28]
Đầu vào:
std::string program = ": square dup * ; 5 square 3 +";

Kết quả mong đợi:
std::vector<long long> expected = {28};
Đầu vào:
string program = ": square dup * ; 5 square 3 +";

Kết quả mong đợi:
long[] expected = new long[] {28};

Giải thích

Define square without executing it. Push 5, duplicate it, multiply to get 25, then push 3 and add to obtain 28.

Ví dụ 2
Đầu vào:
program = "-7 2 / 9 over"

Kết quả mong đợi:
expected = [-3, 9, -3]
Đầu vào:
std::string program = "-7 2 / 9 over";

Kết quả mong đợi:
std::vector<long long> expected = {-3, 9, -3};
Đầu vào:
string program = "-7 2 / 9 over";

Kết quả mong đợi:
long[] expected = new long[] {-3, 9, -3};

Giải thích

−7 divided by 2 truncates toward zero to −3. Push 9, then OVER copies the second-from-top value, −3.

Tham khảo

Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.