Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12788
  • 博文数量: 3
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-01 23:48
文章分类

全部博文(3)

文章存档

2013年(3)

我的朋友
最近访客

分类: PERL

2013-05-08 00:57:05


点击(此处)折叠或打开

  1. #!/usr/bin/perl
  2. use v5.16;
  3. my @tokens = <DATA> =~ m/(\d+|[\+\-\*\/\\(\)])/mxsg;


  4. sub mycal{
  5. my @tokens = @_;
  6. my @stack;
  7. while (@tokens) {
  8.     my $token = shift @tokens;
  9.     given ($token) {
  10.         when (/[\*\/]/) {
  11.          my $next = shift(@tokens);
  12.          if ($next eq '(')
  13.          {
  14.          $next = mycal(get_tokens(\@tokens));
  15.          }
  16.          push @stack, cal($token,pop(@stack),$next);
  17.         }
  18.         when ('(') {
  19.          push @stack, mycal(get_tokens(\@tokens));
  20.         }
  21.         default {
  22.          push @stack, $token;
  23.         }
  24.     }
  25. }
  26. my @result;
  27. while (@stack) {
  28.     my $token = shift @stack;
  29.     given ($token) {
  30.         when (/[\+\-]/) {
  31.          push @result, cal($token,pop(@result),shift(@stack));
  32.         }
  33.         default {
  34.          push @result, $token;
  35.         }
  36.     }
  37. }
  38. return $result[0];
  39. }

  40. say mycal @tokens;

  41. sub cal{
  42.    my ($op, $lval, $rval) = @_;
  43.    given ($op) {
  44.        when ('+') {
  45.      return $lval + $rval;
  46.      }
  47.        when ('-') {
  48.      return $lval - $rval;
  49.      }
  50.        when ('*') {
  51.      return $lval * $rval;
  52.      }
  53.        when ('/') {
  54.      return $lval / $rval;
  55.      }
  56.    }
  57. }

  58. sub get_tokens {
  59.     my $numl = 1;
  60.     my $numr = 0;
  61.     my $ref = shift;
  62.     my @result;
  63.     while ($numl != $numr) {
  64.      my $cur = shift @$ref;
  65.         given ($cur) {
  66.          when ('(') {
  67.              $numl ++;
  68.             }
  69.             when (')') {
  70.              $numr ++;
  71.             }
  72.         }
  73.         push @result, $cur;
  74.     }
  75.     pop @result;
  76.     return @result;
  77. }
  78. __DATA__
  79. (5 * (1 + 2)) * (1 + 1)

阅读(1003) | 评论(0) | 转发(0) |
0

上一篇:POE学习笔记

下一篇:scala语言笔记

给主人留下些什么吧!~~