Reverse Polish Notation Calculator

Setelah ini saya berencana meletakkan beberapa kode yang pernah saya kerjakan di sela-sela waktu belajar saya. Kode yang ini adalah kode pertama.😀

Setiap kode yang saya arsipkan di blog saya ini akan diletakkan di bawah sub-kategori Code Archive yang berada di bawah kategori Programming. Mudah-mudahan bisa bermanfaat untuk pembaca.

Kode yang saya post kali ini adalah Reverse Polish Notation CalculatorReverse Polish Notation (RPN) dikenal juga dengan postfix notation, yaitu notasi di mana operator diletakkan setelah operand.

Program ini dulunya saya buat untuk mendemonstrasikan proses perhitungan operasi postfix di mata pelajaran matematika komputer di kampus saya. Dalam praktiknya, notasi postfix dapat diproses dengan menggunakan sebuah stack.

Berikut adalah tampilan programnya:

Jika kode di bawah ini dibaca, akan terlihat bahwa kalkulator ini masih punya banyak keterbatasan. Kalkulator ini hanya bisa memproses bilangan bulat, sebatas integer 32 bit saja. Selain itu, ukuran dari stack yang dimiliki program ini juga terbatas.

Saya membuatnya di atas IDE Microsoft Visual Studio 2010 Express dan bisa berjalan dengan baik. Jika pembaca menemukan masalah saat melakukan compile atau ternyata program ini memiliki kesalahan pemrosesan, jangan sungkan untuk berkomentar.

Semoga bermanfaat.


/*
 * Reverse Polish Notation Calculator
 * Written by Imam Hidayat
 * https://imamhidayatsite.wordpress.com
**/

#include <iostream>

using namespace std;

typedef enum {
	END,
	INT,

	ADD,
	SUB,
	MUL,
	DIV
}TOKEN;

const int MAX = 100;

int stack[MAX];

int N = 0, current = -1;

int pop(int stack[MAX]) {
	if (current == -1) {
		cout << "Empty stack!" << endl;
		return 0;
	}

	current--;
	N--;

	cout << "  -- POP " << stack[current+1] << endl;
	return stack[current+1];
}

void push(int stack[MAX], int value) {
	N++;
	if (N > MAX) {
		cout << "Stack full!" << endl;
		exit(1);
	}
	current++;
	stack[current] = value;
	cout << "  -- PUSH " << value << endl;
}

char token[MAX];

TOKEN get_next_token(FILE *input) {
	int index = 0;
	strcpy(token, "");
	char c = getc(input);
	while (true) {
		if (isdigit(c)) {
			token[index] = c;
			index++;
			c = getc(input);
		}
		else {
			if (index > 0) {
				token[index] = '\0';
				ungetc(c, input);
				return INT;
			}

			switch (c) {
				case '+':
					return ADD;
				case '-':
					return SUB;
				case '*':
					return MUL;
				case '/':
					return DIV;
				case '\n':
					return END;
				case ' ':
					c = getc(input);
					break;
				default:
					cout << "Error!" << endl;
					exit(1);
			}
		}
	}
}

int operate(TOKEN token, int op1, int op2) {
	switch (token) {
		case ADD:
			return op1 + op2;
		case SUB:
			return op1 - op2;
		case MUL:
			return op1 * op2;
		case DIV:
			return op1 / op2;
	}
}

void evaluate(int stack[MAX], FILE *input) {
	TOKEN current_token;
	current_token = get_next_token(input);
	cout << "---------------------------------------------------------------" << endl;
	cout << "Mengevaluasi ekspresi! Lihat operasi pada stack di bawah ini : " << endl;
	cout << "---------------------------------------------------------------" << endl;
	while (current_token != END) {
		int op1, op2;
		switch (current_token) {
			case ADD:
			case SUB:
			case MUL:
			case DIV:
				op2 = pop(stack);
				op1 = pop(stack);
				push(stack, operate(current_token, op1, op2));
				break;
			case INT:
				push(stack, atoi(token));
				break;
		}
		current_token = get_next_token(input);
	}
	int result = pop(stack);
	cout << "--------------------------------" << endl;
	cout << "Result = " << result << endl << endl;
}

int main() {
	while (true) {
		cout << "Masukkan ekspresi matematika dalam notasi RPN. (Ctrl + C untuk keluar)" << endl;
		cout << "Ekspresi: ";

		evaluate(stack, stdin);
	}

	return 0;
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s