Advertisement
Guest User

Untitled

a guest
Oct 13th, 2015
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.33 KB | None | 0 0
  1. use feature 'switch';
  2. our $minus = 0; #флаг, который устанавливается при обнаружении унарного минуса
  3.  
  4. while (<>) {
  5. my @F, $F, @RPN, @stack;
  6. chomp;
  7. @F = split;
  8.  
  9. #преобразуем в обратную польскую нотацию применяя метод сортировочной станции
  10. for my $i (0 .. $#F) {
  11. given ($F[$i]) {
  12. when (/\d+/) {if ($minus) {push @RPN, -$_; $minus = 0}
  13. else {push @RPN, $_}
  14. }
  15.  
  16. when ('(') {push @stack, '('}
  17. when (')') {
  18. #перекидываем знаки операций в массив с ОПН
  19. while ($stack[-1] !~ m/\(/) {push @RPN, pop @stack}
  20. #выкидываем открывающую скобку
  21. pop @stack;
  22. }
  23. when ('^') {
  24. while ($stack[-1] =~ m/\^/) {push @RPN, pop @stack}
  25. push @stack, '^'
  26. }
  27. when ('*') {
  28. while ($stack[-1] =~ m/\^|\*|\//) {push @RPN, pop @stack}
  29. push @stack, '*'
  30. }
  31. when ('/') {
  32. while ($stack[-1] =~ m/\^|\*|\//) {push @RPN, pop @stack}
  33. push @stack, '/'
  34. }
  35. when ('+') {
  36. while ($stack[-1] =~ m/\^|\*|\/|\+|-/) {push @RPN, pop @stack}
  37. push @stack, '+'
  38. }
  39. when ('-') {
  40. #Проверка на унарный минус
  41. if ($i == 0 or $F[$i-1] !~ m/\d+|\)/) {$minus = 1}
  42. else {
  43. while ($stack[-1] =~ m/\^|\*|\/|\+|-/) {push @RPN, pop @stack}
  44. push @stack, '-';
  45. }
  46. }
  47. }
  48.  
  49. }
  50.  
  51. while (@stack) {push @RPN, pop @stack}
  52.  
  53. print "RPN: ".join(" ", @RPN);
  54.  
  55.  
  56. #вычисляем ответ
  57. while (@RPN) {
  58. if ($RPN[0] =~ m/\d/) {push @stack, shift @RPN}
  59. else {
  60. given ($RPN[0]) {
  61. when ('^') {
  62. my $result = $stack[-2] ** $stack[-1];
  63. pop @stack;
  64. pop @stack;
  65. push @stack, $result;
  66. }
  67. when ('*') {
  68. my $result = $stack[-2] * $stack[-1];
  69. pop @stack;
  70. pop @stack;
  71. push @stack, $result;
  72. }
  73. when ('/') {
  74. my $result = $stack[-2] / $stack[-1];
  75. pop @stack;
  76. pop @stack;
  77. push @stack, $result;
  78. }
  79. when ('-') {
  80. my $result = $stack[-2] - $stack[-1];
  81. pop @stack;
  82. pop @stack;
  83. push @stack, $result;
  84. }
  85. when ('+') {
  86. my $result = $stack[-2] + $stack[-1];
  87. pop @stack;
  88. pop @stack;
  89. push @stack, $result;
  90. }
  91. }
  92. shift @RPN;
  93. }
  94. }
  95.  
  96. print "\nresult = ";
  97. print @stack;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement