FLYING

〈全日本・紀文豆乳飲料シリーズ「麦芽コーヒー」の500ミリリットルパックを扱う小売店が少ないことに遺憾の意を表明する会〉活動記録

逆ポーランドその1

#include <stdio.h>
#define STACK_SIZE 100

int stack[STACK_SIZE];
int stack_size = 0;

int pop()
{
	if (stack_size <= 0) return 0;
	return stack[--stack_size];
}

int push(int a)
{
	stack[stack_size++] = a;
}

int calc(char *s)
{
	int a, b, type;
	while (*s) {
		switch(*s) {
		case ' ':
			break;
		case '+':
			a = pop();
			b = pop();
			push(b+a);
			break;
		case '-':
			a = pop();
			b = pop();
			push(b-a);
			break;
		case '*':
			a = pop();
			b = pop();
			push(b*a);
			break;
		case '/':
			a = pop();
			b = pop();
			if (a == 0) break;
			push(b/a);
			break;
		case '%':
			a = pop();
			b = pop();
			if (a == 0) break;
			push(b%a);
			break;
		default:
			push(*s - '0');
		}
		s++;
	}
	return pop();
}

int main()
{
	char s[100];
	printf("逆ポーランドで入力\n");
	scanf("%[^\n]*s", s);
	printf("%s = %d\n", s, calc(s));
}

デリミタを使わない、1桁の符号なし整数のみに対応した逆ポーランド記法による計算プログラム。これがもっともシンプルな形になると思われる。スタックという仕組みを利用することさえ分かれば、実装するのは結構あっけない。とりあえずは、色々な整数で計算が出来るように拡張していくつもり。