+ -
当前位置:首页 → 问答吧 → 求助:除去成对的括号

求助:除去成对的括号

时间:2011-02-19

来源:互联网

设最外层括号为第 1 层,请问怎么样能够除去 1 对第 2 层的括号,保留其他括号?

谢谢!

例如:
  1. (((1,2),3),4)   =>  ((1,2),3,4)

  2. ((1,2),(3,4))   =>  ((1,2),3,4)
  3.                         or
  4.                     (1,2,(3,4))
  5.                     
  6. (1,(2,(3,4)))   => (1,2,(3,4))
复制代码

作者: longbow0   发布时间: 2011-02-19

基本能够完成任务的代码,请各位指正。
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. while (<DATA>) {
  5.     next if /^#/;
  6.     next if /^\s*$/;
  7.     chomp;
  8.    
  9.     print $_, "==>\n";
  10.    
  11.     my ($lnode, $rnode) = getNodes($_);
  12.    
  13.     if ($lnode =~ /^\(/) {
  14.         my $str = $lnode;
  15.         
  16.         my ($lnode, $mnode) = getNodes($str);
  17.         
  18.         print join(',', ($lnode, $mnode, $rnode)), "\n";
  19.     }
  20.     else {
  21.         my $str = $rnode;
  22.         
  23.         my ($mnode, $rnode) = getNodes($str);
  24.         
  25.         print join(',', ($lnode, $mnode, $rnode)), "\n";
  26.     }
  27. }

  28. =begin
  29.   Name:     getNodes
  30.   Desc:     Get 2 nodes of a binary tree
  31.   Usage:    getNodes($str)
  32.   Args:     A string
  33.   Return:   2 strings
  34. =cut

  35. sub getNodes {
  36.     my ($str) = @_;
  37.    
  38.     # Remove leading and tailing parentheses
  39.     # $str =~ s/^\(|\)$//g;
  40.    
  41.     # '((1,2),3)'
  42.     if ($str =~ /^\((\(.+\)),(\w+)\)$/) {
  43.     #    print "L\n";
  44.         return ($1, $2);
  45.     }
  46.     # '((1,2),(3,4))'
  47.     elsif ($str =~ /^\((\(.+\)),(\(.+\))\)$/) {
  48.     #    print "M\n";
  49.         return ($1, $2);
  50.     }
  51.     # '(1,(2,3))'
  52.     elsif ($str =~ /^\((\w+),(\(.+\))\)$/) {
  53.     #    print "R\n";
  54.         return ($1, $2);
  55.     }
  56.     # '(1,2)'
  57.     elsif ($str =~ /^\((\w+),(\w+)\)$/) {
  58.         return ($1, $2);
  59.     }
  60.     else {
  61.         print "Error!\n";
  62.         return (0, 0);
  63.     }
  64. }

  65. __DATA__
  66. (((1,2),3),4)
  67. ((1,2),(3,4))
  68. (1,(2,(3,4)))
  69. ((1,2),(3,(4,5)))
  70. (((((1,2),3),4),(5,6))
复制代码
输出
  1. (((1,2),3),4)==>
  2. (1,2),3,4
  3. ((1,2),(3,4))==>
  4. 1,2,(3,4)
  5. (1,(2,(3,4)))==>
  6. 1,2,(3,4)
  7. ((1,2),(3,(4,5)))==>
  8. 1,2,(3,(4,5))
  9. (((((1,2),3),4),(5,6))==>
  10. (((1,2),3),4,(5,6)
复制代码

作者: longbow0   发布时间: 2011-02-20