import std.conv;
import std.stdio;
import std.string;
class Stack {
// Это конструктор, кароч.
// Параметр задает начальную глубину стека.
this(size_t stack_depth) {
data = new double[](stack_depth);
}
// Запихиваем в стек новое значение
void push(double value) {
// Наш стек - резиновый. Cпособен
// расширяться, пока хватает памяти
if (stack_pointer == (data.length - 1)) {
data.length += 1;
}
data[stack_pointer++] = value;
}
// Извлечение значения из стека
double pop() {
if (stack_pointer == 0) {
throw new Exception("Ты че творишь, лалка? Стек-то пустой совсем!");
}
return data[--stack_pointer];
}
// Прочитать, но не извлекать
double read() {
if (stack_pointer == 0) {
throw new Exception("");
}
return data[stack_pointer - 1];
}
// Очистить
void clean() {
stack_pointer = 0;
}
private size_t stack_pointer; // Указывает на текушую позицию в стеке
private double[] data;
}
void main() {
double temp;
auto stack = new Stack(512);
// Читаем stdin построчно
foreach (line; stdin.byLine) {
// делим каждую строку на токены
foreach (token; line.split) {
switch (token) {
case "q":
return;
case "c":
stack.clean;
break;
case "p":
try writeln(stack.read);
catch (Exception e) {
writeln("Empty");
}
break;
case "+":
temp = stack.pop;
stack.push(stack.pop + temp);
break;
case "-":
temp = stack.pop;
stack.push(stack.pop - temp);
break;
case "*":
temp = stack.pop;
stack.push(stack.pop * temp);
break;
case "/":
temp = stack.pop;
if (temp == 0) {
throw new Error("Внимание! Ситyация 42! Получен ответ на главный вопрос жизни, вселенной и всего такого азазазаз))))");
}
stack.push(stack.pop / temp);
break;
default:
// Если введен не знак операции, то мы думаем, что это число.
// Пробуем запихать его в стек. Если юзер введет какую-то херню
// вместо числа, то вылетит исключение.
try stack.push( to!(double)(token) );
catch (Exception e) {
stack.clean;
writeln("?");
}
}
}
}
}