fork download
  1. import std.conv;
  2. import std.stdio;
  3. import std.string;
  4.  
  5. class Stack {
  6. // Это конструктор, кароч.
  7. // Параметр задает начальную глубину стека.
  8. this(size_t stack_depth) {
  9. data = new double[](stack_depth);
  10. }
  11.  
  12. // Запихиваем в стек новое значение
  13. void push(double value) {
  14. // Наш стек - резиновый. Cпособен
  15. // расширяться, пока хватает памяти
  16. if (stack_pointer == (data.length - 1)) {
  17. data.length += 1;
  18. }
  19.  
  20. data[stack_pointer++] = value;
  21. }
  22.  
  23. // Извлечение значения из стека
  24. double pop() {
  25. if (stack_pointer == 0) {
  26. throw new Exception("Ты че творишь, лалка? Стек-то пустой совсем!");
  27. }
  28.  
  29. return data[--stack_pointer];
  30. }
  31.  
  32. // Прочитать, но не извлекать
  33. double read() {
  34. if (stack_pointer == 0) {
  35. throw new Exception("");
  36. }
  37. return data[stack_pointer - 1];
  38. }
  39.  
  40. // Очистить
  41. void clean() {
  42. stack_pointer = 0;
  43. }
  44.  
  45. private size_t stack_pointer; // Указывает на текушую позицию в стеке
  46. private double[] data;
  47. }
  48.  
  49. void main() {
  50. double temp;
  51. auto stack = new Stack(512);
  52.  
  53. // Читаем stdin построчно
  54. foreach (line; stdin.byLine) {
  55. // делим каждую строку на токены
  56. foreach (token; line.split) {
  57. switch (token) {
  58. case "q":
  59. return;
  60.  
  61. case "c":
  62. stack.clean;
  63. break;
  64.  
  65. case "p":
  66. try writeln(stack.read);
  67. catch (Exception e) {
  68. writeln("Empty");
  69. }
  70. break;
  71.  
  72. case "+":
  73. temp = stack.pop;
  74. stack.push(stack.pop + temp);
  75. break;
  76.  
  77. case "-":
  78. temp = stack.pop;
  79. stack.push(stack.pop - temp);
  80. break;
  81.  
  82. case "*":
  83. temp = stack.pop;
  84. stack.push(stack.pop * temp);
  85. break;
  86.  
  87. case "/":
  88. temp = stack.pop;
  89.  
  90. if (temp == 0) {
  91. throw new Error("Внимание! Ситyация 42! Получен ответ на главный вопрос жизни, вселенной и всего такого азазазаз))))");
  92. }
  93.  
  94. stack.push(stack.pop / temp);
  95. break;
  96.  
  97. default:
  98. // Если введен не знак операции, то мы думаем, что это число.
  99. // Пробуем запихать его в стек. Если юзер введет какую-то херню
  100. // вместо числа, то вылетит исключение.
  101. try stack.push( to!(double)(token) );
  102. catch (Exception e) {
  103. stack.clean;
  104. writeln("?");
  105. }
  106. }
  107. }
  108. }
  109. }
Success #stdin #stdout 0.01s 2092KB
stdin
3 5 + p
2 - p
7 / p
-12 + p
-3.13 * p

stdout
8
6
0.857143
-11.1429
34.8771