一日一プロ

逆ポーランド記法

スタック練習

using System;
using System.Collections.Generic;

namespace stack
{
	class MainClass
	{
		public const int ERROR = 0xFFFF;
		public static List<int> stack = new List<int> ();

		public static void Main (string[] args)
		{

			//入力
			string[] str = Console.ReadLine ().Split (' ');

			for (int i = 0; i < str.Length; i++) {
				int a, b;
				switch (str [i]) {
				case "+":
					b = pop ();
					a = pop ();
					if (a != ERROR && b != ERROR) {
						push (a + b);
					} else {
						Console.WriteLine ("ERROR");
						break;
					}
					break;
				case "-":
					b = pop ();
					a = pop ();
					if (a != ERROR && b != ERROR) {
						push (a - b);
					} else {
						Console.WriteLine ("ERROR");
						break;
					}
					break;
				case "*":
					b = pop ();
					a = pop ();
					if (a != ERROR && b != ERROR) {
						push (a * b);
					} else {
						Console.WriteLine ("ERROR");
						break;
					}
					break;
				case "/":
					b = pop ();
					a = pop ();
					if (a != ERROR && b != ERROR) {
						push (a / b);
					} else {
						Console.WriteLine ("ERROR");
						break;
					}
					break;
				default:
					int s = int.Parse (str [i]);
					push (s);
					break;
				}
			}
			int ans = pop ();
			Console.WriteLine ("{0}", ans);
		}

		public static void push(int num)
		{
			stack.Add (num);
		}

		public static int pop()
		{
			int ret;

			if (stack.Count != 0) {
				ret = stack [stack.Count - 1];
				stack.RemoveAt (stack.Count - 1);
			} else {
				ret = ERROR;
			}
			return ret;
		}
	}
}