Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use feature 'switch';
- our $minus = 0; #флаг, который устанавливается при обнаружении унарного минуса
- while (<>) {
- my @F, $F, @RPN, @stack;
- chomp;
- @F = split;
- #преобразуем в обратную польскую нотацию применяя метод сортировочной станции
- for my $i (0 .. $#F) {
- given ($F[$i]) {
- when (/\d+/) {if ($minus) {push @RPN, -$_; $minus = 0}
- else {push @RPN, $_}
- }
- when ('(') {push @stack, '('}
- when (')') {
- #перекидываем знаки операций в массив с ОПН
- while ($stack[-1] !~ m/\(/) {push @RPN, pop @stack}
- #выкидываем открывающую скобку
- pop @stack;
- }
- when ('^') {
- while ($stack[-1] =~ m/\^/) {push @RPN, pop @stack}
- push @stack, '^'
- }
- when ('*') {
- while ($stack[-1] =~ m/\^|\*|\//) {push @RPN, pop @stack}
- push @stack, '*'
- }
- when ('/') {
- while ($stack[-1] =~ m/\^|\*|\//) {push @RPN, pop @stack}
- push @stack, '/'
- }
- when ('+') {
- while ($stack[-1] =~ m/\^|\*|\/|\+|-/) {push @RPN, pop @stack}
- push @stack, '+'
- }
- when ('-') {
- #Проверка на унарный минус
- if ($i == 0 or $F[$i-1] !~ m/\d+|\)/) {$minus = 1}
- else {
- while ($stack[-1] =~ m/\^|\*|\/|\+|-/) {push @RPN, pop @stack}
- push @stack, '-';
- }
- }
- }
- }
- while (@stack) {push @RPN, pop @stack}
- print "RPN: ".join(" ", @RPN);
- #вычисляем ответ
- while (@RPN) {
- if ($RPN[0] =~ m/\d/) {push @stack, shift @RPN}
- else {
- given ($RPN[0]) {
- when ('^') {
- my $result = $stack[-2] ** $stack[-1];
- pop @stack;
- pop @stack;
- push @stack, $result;
- }
- when ('*') {
- my $result = $stack[-2] * $stack[-1];
- pop @stack;
- pop @stack;
- push @stack, $result;
- }
- when ('/') {
- my $result = $stack[-2] / $stack[-1];
- pop @stack;
- pop @stack;
- push @stack, $result;
- }
- when ('-') {
- my $result = $stack[-2] - $stack[-1];
- pop @stack;
- pop @stack;
- push @stack, $result;
- }
- when ('+') {
- my $result = $stack[-2] + $stack[-1];
- pop @stack;
- pop @stack;
- push @stack, $result;
- }
- }
- shift @RPN;
- }
- }
- print "\nresult = ";
- print @stack;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement