EightCoins

Posted on

EightCoins

Algorithm Gossip: 八枚银币

说明

现有八枚银币a b c d e f g h,已知其中一枚是假币,其重量不同于真币,但不知是较轻或较重,如何使用天平以最少的比较次数,决定出哪枚是假币,并得知假币比真币较轻或较重。

解法

单就求假币的问题是不难,但问题限制使用最少的比较次数,所以我们不能以单纯的回圈比较来求解,我们可以使用决策树(decision tree),使用分析与树状图来协助求解。 一个简单的状况是这样的,我们比较a+b+c与d+e+f ,如果相等,则假币必是g或h,我们先比较g或h哪个较重,如果g较重,再与a比较(a是真币),如果g等于a,则g为真币,则h为假币,由于h比g轻而 g是真币,则h假币的重量比真币轻。 完整的比较决策树如下图所示: 八枚银币 为了方便使用回圈,使用号码0至7表示银币,范例程式可以让您输入假币重量,但您无法事先得知假币是哪一枚,程式可得知假币是哪一枚,且它比真币轻或重。

实作

  • C /#include /#include /#include void compare(int[], int, int, int); void eightcoins(int[]); int main(void) { int coins[8] = {0}; int i; srand(time(NULL)); for(i = 0; i < 8; i++) coins[i] = 10; printf("\n输入假币重量(比10大或小):"); scanf("%d", &i); coins[rand() % 8] = i; eightcoins(coins); printf("\n\n列出所有钱币重量:"); for(i = 0; i < 8; i++) printf("%d ", coins[i]); printf("\n"); return 0; } void compare(int coins[], int i, int j, int k) { if(coins[i] > coins[k]) printf("\n假币 %d 较重", i+1); else printf("\n假币 %d 较轻", j+1); } void eightcoins(int coins[]) { if(coins[0]+coins[1]+coins[2] == coins[3]+coins[4]+coins[5]) { if(coins[6] > coins[7]) compare(coins, 6, 7, 0); else compare(coins, 7, 6, 0); } else if(coins[0]+coins[1]+coins[2] > coins[3]+coins[4]+coins[5]) { if(coins[0]+coins[3] == coins[1]+coins[4]) compare(coins, 2, 5, 0); else if(coins[0]+coins[3] > coins[1]+coins[4]) compare(coins, 0, 4, 1); if(coins[0]+coins[3] < coins[1]+coins[4]) compare(coins, 1, 3, 0); } else if(coins[0]+coins[1]+coins[2] < coins[3]+coins[4]+coins[5]) { if(coins[0]+coins[3] == coins[1]+coins[4]) compare(coins, 5, 2, 0); else if(coins[0]+coins[3] > coins[1]+coins[4]) compare(coins, 3, 1, 0); if(coins[0]+coins[3] < coins[1]+coins[4]) compare(coins, 4, 0, 1); } }

  • Java public class Coins { private int[] coins; public Coins() { coins = new int[8]; for(int i = 0; i < 8; i++) coins[i] = 10; } public void setFake(int weight) { coins[(int) (Math.random() /* 7)] = weight; } public void fake() { if(coins[0]+coins[1]+coins[2] == coins[3]+coins[4]+coins[5]) { if(coins[6] > coins[7]) compare(6, 7, 0); else compare(7, 6, 0); } else if(coins[0]+coins[1]+coins[2] > coins[3]+coins[4]+coins[5]) { if(coins[0]+coins[3] == coins[1]+coins[4]) compare(2, 5, 0); else if(coins[0]+coins[3] > coins[1]+coins[4]) compare(0, 4, 1); if(coins[0]+coins[3] < coins[1]+coins[4]) compare(1, 3, 0); } else if(coins[0]+coins[1]+coins[2] < coins[3]+coins[4]+coins[5]) { if(coins[0]+coins[3] == coins[1]+coins[4]) compare(5, 2, 0); else if(coins[0]+coins[3] > coins[1]+coins[4]) compare(3, 1, 0); if(coins[0]+coins[3] < coins[1]+coins[4]) compare(4, 0, 1); } } protected void compare(int i, int j, int k) { if(coins[i] > coins[k]) System.out.print("\n假币 " + (i+1) + " 较重"); else System.out.print("\n假币 " + (j+1) + " 较轻"); } public static void main(String[] args) { if(args.length == 0) { System.out.println("输入假币重量(比10大或小)"); System.out.println("ex. java Coins 5"); return; } Coins eightCoins = new Coins(); eightCoins.setFake(Integer.parseInt(args[0])); eightCoins.fake(); } }

LifeGame

Posted on

LifeGame

Algorithm Gossip: 生命游戏

说明

生命游戏(game of life)为1970年由英国数学家J. H. Conway所提出,某一细胞的邻居包括上、下、左、右、左上、左下、右上与右下相邻之细胞,游戏规则如下:

  1. 孤单死亡:如果细胞的邻居小于一个,则该细胞在下一次状态将死亡。
  2. 拥挤死亡:如果细胞的邻居在四个以上,则该细胞在下一次状态将死亡。
  3. 稳定:如果细胞的邻居为二个或三个,则下一次状态为稳定存活。
  4. 复活:如果某位置原无细胞存活,而该位置的邻居为三个,则该位置将复活一细胞。

解法

生命游戏的规则可简化为以下,并使用CASE比对即可使用程式实作:

  1. 邻居个数为0、1、4、5、6、7、8时,则该细胞下次状态为死亡。
  2. 邻居个数为2时,则该细胞下次状态为稳定。
  3. 邻居个数为3时,则该细胞下次状态为复活。

实作

  • C /#include /#include /#include /#define MAXROW 10 /#define MAXCOL 25 /#define DEAD 0 /#define ALIVE 1 int map[MAXROW][MAXCOL], newmap[MAXROW][MAXCOL]; void init(); int neighbors(int, int); void outputMap(); void copyMap(); int main() { int row, col; char ans; init(); while(1) { outputMap(); for(row = 0; row < MAXROW; row++) { for(col = 0; col < MAXCOL; col++) { switch (neighbors(row, col)) { case 0: case 1: case 4: case 5: case 6: case 7: case 8: newmap[row][col] = DEAD; break; case 2: newmap[row][col] = map[row][col]; break; case 3: newmap[row][col] = ALIVE; break; } } } copyMap(); printf("\nContinue next Generation ? "); getchar(); ans = toupper(getchar()); if(ans != 'Y') break; } return 0; } void init() { int row, col; for(row = 0; row < MAXROW; row++) for(col = 0; col < MAXCOL; col++) map[row][col] = DEAD; puts("Game of life Program"); puts("Enter x, y where x, y is living cell"); printf("0 <= x <= %d, 0 <= y <= %d\n", MAXROW-1, MAXCOL-1); puts("Terminate with x, y = -1, -1"); while(1) { scanf("%d %d", &row, &col); if(0 <= row && row < MAXROW && 0 <= col && col < MAXCOL) map[row][col] = ALIVE; else if(row == -1 || col == -1) break; else printf("(x, y) exceeds map ranage!"); } } int neighbors(int row, int col) { int count = 0, c, r; for(r = row-1; r <= row+1; r++) for(c = col-1; c <= col+1; c++) { if(r < 0 || r >= MAXROW || c < 0 || c >= MAXCOL) continue; if(map[r][c] == ALIVE) count++; } if(map[row][col] == ALIVE) count--; return count; } void outputMap() { int row, col; printf("\n\n%20cGame of life cell status\n"); for(row = 0; row < MAXROW; row++) { printf("\n%20c", ' '); for(col = 0; col < MAXCOL; col++) if(map[row][col] == ALIVE) putchar('/#'); else putchar('-'); } } void copyMap() { int row, col; for(row = 0; row < MAXROW; row++) for(col = 0; col < MAXCOL; col++) map[row][col] = newmap[row][col]; }

  • Java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class LifeGame { private boolean[][] map; private boolean[][] newmap; public LifeGame(int maxRow, int maxColumn) { map = new boolean[maxRow][maxColumn]; newmap = new boolean[maxRow][maxColumn]; } public void setCell(int x, int y) { map[x][y] = true; } public void next() { for(int row = 0; row < map.length; row++) { for(int col = 0; col < map[0].length; col++) { switch (neighbors(row, col)) { case 0: case 1: case 4: case 5: case 6: case 7: case 8: newmap[row][col] = false; break; case 2: newmap[row][col] = map[row][col]; break; case 3: newmap[row][col] = true; break; } } } copyMap(); } public void outputMap() throws IOException { System.out.println("\n\nGame of life cell status"); for(int row = 0; row < map.length; row++) { System.out.print("\n "); for(int col = 0; col < map[0].length; col++) if(map[row][col] == true) System.out.print('/#'); else System.out.print('-'); } } private void copyMap() { for(int row = 0; row < map.length; row++) for(int col = 0; col < map[0].length; col++) map[row][col] = newmap[row][col]; } private int neighbors(int row, int col) { int count = 0; for(int r = row-1; r <= row+1; r++) for(int c = col-1; c <= col+1; c++) { if(r < 0 || r >= map.length || c < 0 || c >= map[0].length) continue; if(map[r][c] == true) count++; } if(map[row][col] == true) count--; return count; } public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader bufReader = new BufferedReader( new InputStreamReader(System.in)); LifeGame game = new LifeGame(10, 25); System.out.println("Game of life Program"); System.out.println( "Enter x, y where x, y is living cell"); System.out.println("0 <= x < 10, 0 <= y < 25"); System.out.println("Terminate with x, y = -1, -1"); while(true) { String[] strs = bufReader.readLine().split(" "); int row = Integer.parseInt(strs[0]); int col = Integer.parseInt(strs[1]); if(0 <= row && row < 10 && 0 <= col && row < 25) game.setCell(row, col); else if(row == -1 || col == -1) { break; } else { System.out.print( "(x, y) exceeds map ranage!"); } } while(true) { game.outputMap(); game.next(); System.out.print( "\nContinue next Generation ? "); String ans = bufReader.readLine().toUpperCase(); if(!ans.equals("Y")) break; } } }

Java实现将多个文件打包压缩成tar_gz文件

Posted on

Java实现将多个文件打包压缩成tar_gz文件 - 易锐的日志 - 网易博客

网易

新闻微博邮箱相册阅读有道摄影爱拍闪电邮手机邮印像派梦幻人生 更多

博客

手机博客博客搬家博客VIP服务 LiveWriter写博word写博邮件写博短信写博 群博客博客油菜地博客话题博客热点博客圈子找朋友 发现

小组 风格

博客VIP服务

创建博客 登录

关注

重要提醒:系统检测到您的帐号可能存在被盗风险,请尽快查看风险提示,并立即修改密码。 | 关闭

网易博客安全提醒:系统检测到您当前密码的安全性较低,为了您的账号安全,建议您适时修改密码 立即修改 | 关闭 显示下一条 | 关闭

易锐的博客

我的博客

导航

日志

eclipse注释规范设置

Java实现将多个文件打包压缩成tar.gz文件

2009-11-06 15:30:06| 分类: 默认分类 | 标签: |字号大中小 订阅

后缀为tar.gz的文件实际上时先将文件(单个或多个)打包成后缀为tar的(tar包)文件,再用gzip压缩成gz文件,如此来说我们便可以用两步来实现此功能,请看代码:

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.GZIPOutputStream;

import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; import org.apache.commons.compress.utils.IOUtils;

/// / @Title: GZIPUtil.java / @Description: gzip文件压缩和解压缩工具类 / @author LM / @date 2009-11-4 下午06:23:29 / @version V1.0 // public class GZIPUtil {

/// / / @Title: pack / @Description: 将一组文件打成tar包 / @param sources 要打包的原文件数组 / @param target 打包后的文件 / @return File 返回打包后的文件 / @throws // public static File pack(File[] sources, File target){ FileOutputStream out = null; try { out = new FileOutputStream(target); } catch (FileNotFoundException e1) { e1.printStackTrace(); } TarArchiveOutputStream os = new TarArchiveOutputStream(out); for (File file : sources) { try { os.putArchiveEntry(new TarArchiveEntry(file)); IOUtils.copy(new FileInputStream(file), os); os.closeArchiveEntry();

} catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } if(os != null) { try { os.flush(); os.close(); } catch (IOException e) { e.printStackTrace(); } }

return target; }

/// / / @Title: compress / @Description: 将文件用gzip压缩 / @param source 需要压缩的文件 / @return File 返回压缩后的文件 / @throws /*/ public static File compress(File source) { File target = new File(source.getName() + ".gz"); FileInputStream in = null; GZIPOutputStream out = null; try { in = new FileInputStream(source); out = new GZIPOutputStream(new FileOutputStream(target)); byte[] array = new byte[1024]; int number = -1; while((number = in.read(array, 0, array.length)) != -1) { out.write(array, 0, number); } } catch (FileNotFoundException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } finally { if(in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); return null; } }

if(out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); return null; } } } return target; }

public static void main(String[] args) { File[] sources = new File[] {new File("task.xml"), new File("app.properties")}; File target = new File("release_package.tar"); compress(pack(sources, target)); } }

可以打包压缩,那么解压缩就是反其道而行,有时间再来写一篇解压缩的。 评论这张

转发至微博 转发至微博

0人 | 分享到:

阅读(674)| 评论(0)| 引用 (0) |举报

eclipse注释规范设置

历史上的今天

相关文章

最近读者

评论

this.p={ m:2, b:2, id:'fks_083066081080089069080083087095092087087070085087094070', blogTitle:'Java实现将多个文件打包压缩成tar.gz文件', blogAbstract:'后缀为tar.gz的文件实际上时先将文件(单个或多个)打包成后缀为tar的(tar包)文件,再用gzip压缩成gz文件,如此来说我们便可以用两步来实现此功能,请看代码:\r\nimport java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.zip.GZIPOutputStream;\r\nimport org.apache.commons.compress.archivers.tar.TarArchiveEntry;', blogTag:'', blogUrl:'blog/static/8165118520091063306587', isPublished:1, istop:false, type:0, modifyTime:0, publishTime:1257492606587, permalink:'blog/static/8165118520091063306587', commentCount:0, mainCommentCount:0, recommendCount:0, bsrk:-100, publisherId:0, recomBlogHome:false, attachmentsFileIds:[], vote:{}, groupInfo:{}, friendstatus:'none', followstatus:'unFollow', pubSucc:'', visitorProvince:'广东', visitorCity:'深圳', postAddInfo:{}, mset:'000', mcon:'', srk:-100, remindgoodnightblog:false, isBlackVisitor:false, isShowYodaoAd:false, hostIntro:'', hmcon:'' } {list a as x} {if !!x}

{if x.visitorName==visitor.userName} ${x.visitorNickname|escape} {else} ${x.visitorNickname|escape} {/if}
{if x.moveFrom=='wap'} {elseif x.moveFrom=='iphone'} {elseif x.moveFrom=='android'} {elseif x.moveFrom=='mobile'} {/if} ${fn(x.visitorNickname,8)|escape}
{/if} {/list} {if !!a} ${fn(a.nickname,8)|escape}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{/if} </#--最新日志,群博日志--> {list a as x} {if !!x}
  • ${fn(x.title,26)|escape}
  • {/if} {/list} </#--推荐日志-->

    推荐过这篇日志的人:

    {list a as x} {if !!x} {/if} {/list}
    {if !!b&&b.length>0}

    他们还推荐了:

    {/if} </#--引用记录--> 引用记录: </#--博主推荐--> {list a as x} {if !!x}
  • ${x.title|default:""|escape}
  • {/if} {/list} </#--随机阅读--> {list a as x} {if !!x}
  • ${x.title|default:""|escape}
  • {/if} {/list} </#--首页推荐--> {list a as x} {if !!x}
  • ${x.blogTile|default:""|escape}
  • {/if} {/list} </#--相关文章-->
      {list a as x} {if x_index>9}{break}{/if} {if !!x}
    • ${x.title|default:""|escape}${fn2(parseInt(x.date),'yyyy-MM-dd HH:mm:ss')}
    • {/if} {/list}
    </#--历史上的今天-->
      {list a as x} {if x_index>4}{break}{/if} {if !!x}
    • ${fn1(x.title,60)|escape}${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
    • {/if} {/list}
    </#--右边模块结构-->

    最新日志

      该作者的其他文章

        博主推荐

          相关日志

            随机阅读

              首页推荐


                对“推广广告”提建议

                </#--评论模块结构-->
                </#--引用模块结构-->
                </#--博主发起的投票--> {list a as x} {if !!x}
              • ${x.nickName|escape} 投票给 {var first_option = true;} {list x.voteDetailList as voteToOption} {if voteToOption==1} {if first_option==false},{/if} “${b[voteToOption_index]}” {/if} {/list} {if (x.role!="-1") },“我是${c[x.role]}” {/if} ${fn1(x.voteTime)} {if x.userName==''}{/if} {/if} {/list}

                页脚

                公司简介 - 联系方法 - 招聘信息 - 客户服务 - 隐私政策 - 博客风格 - 手机博客 - VIP博客 - 订阅此博客

                网易公司版权所有 ©1997-2011

                帮助 ${u} {list wl as x}

                ${x.g}
                {list x.l as y} ${y.n} {/list} {/list} {if defined('wl')} {list wl as x}${x.n}{/list} {/if}

              • java打tar

                Posted on

                java打tar

                java**打tar.gz包**

                2011-01-26 00:36

                package src.com.snow.test;

                import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.zip.GZIPOutputStream;

                import org.apache.tools.tar.TarEntry; import org.apache.tools.tar.TarOutputStream; import org.apache.tools.zip.ZipOutputStream;

                // / 功能:压缩文件成tar.gz格式 // public class TarUtils { private static int BUFFER = 1024 / 4; // 缓冲大小 private static byte[] B_ARRAY = new byte[BUFFER];

                // / 方法功能:打包单个文件或文件夹 参数:inputFileName 要打包的文件夹或文件的路径 targetFileName 打包后的文件路径 /*/ public void execute(String inputFileName, String targetFileName) { File inputFile = new File(inputFileName); String base = inputFileName .substring(inputFileName.lastIndexOf("/") + 1); TarOutputStream out = getTarOutputStream(targetFileName); tarPack(out, inputFile, base); try { if (null != out) { out.close(); } } catch (IOException e) { e.printStackTrace(); } compress(new File(targetFileName)); }

                // / 方法功能:打包多个文件或文件夹 参数:inputFileNameList 要打包的文件夹或文件的路径的列表 targetFileName / 打包后的文件路径 // public void execute(List inputFileNameList, String targetFileName) { TarOutputStream out = getTarOutputStream(targetFileName);

                for (String inputFileName : inputFileNameList) { File inputFile = new File(inputFileName); String base = inputFileName.substring(inputFileName .lastIndexOf("/") + 1); tarPack(out, inputFile, base); }

                try { if (null != out) { out.close(); } } catch (IOException e) { e.printStackTrace(); } compress(new File(targetFileName)); }

                // / 方法功能:打包成tar文件 参数:out 打包后生成文件的流 inputFile 要压缩的文件夹或文件 base 打包文件中的路径 /*/

                private void tarPack(TarOutputStream out, File inputFile, String base) { if (inputFile.isDirectory()) // 打包文件夹 { packFolder(out, inputFile, base); } else // 打包文件 { packFile(out, inputFile, base); } }

                // / 方法功能:遍历文件夹下的内容,如果有子文件夹,就调用tarPack方法 参数:out 打包后生成文件的流 inputFile 要压缩的文件夹或文件 / base 打包文件中的路径 // private void packFolder(TarOutputStream out, File inputFile, String base) { File[] fileList = inputFile.listFiles(); try { // 在打包文件中添加路径 out.putNextEntry(new TarEntry(base + "/")); } catch (IOException e) { e.printStackTrace(); } base = base.length() == 0 ? "" : base + "/"; for (File file : fileList) { tarPack(out, file, base + file.getName()); } }

                // / 方法功能:打包文件 参数:out 压缩后生成文件的流 inputFile 要压缩的文件夹或文件 base 打包文件中的路径 /*/ private void packFile(TarOutputStream out, File inputFile, String base) { TarEntry tarEntry = new TarEntry(base);

                // 设置打包文件的大小,如果不设置,打包有内容的文件时,会报错 tarEntry.setSize(inputFile.length()); try { out.putNextEntry(tarEntry); } catch (IOException e) { e.printStackTrace(); } FileInputStream in = null; try { in = new FileInputStream(inputFile); } catch (FileNotFoundException e) { e.printStackTrace(); } int b = 0;

                try { while ((b = in.read(B_ARRAY, 0, BUFFER)) != -1) { out.write(B_ARRAY, 0, b); } } catch (IOException e) { e.printStackTrace(); } catch (NullPointerException e) { System.err .println("NullPointerException info ======= [FileInputStream is null]"); } finally { try { if (null != in) { in.close(); } if (null != out) { out.closeEntry(); } } catch (IOException e) {

                } } }

                // / 方法功能:把打包的tar文件压缩成gz格式 参数:srcFile 要压缩的tar文件路径 /*/ private void compress(File srcFile) { File target = new File(srcFile.getAbsolutePath() + ".gz"); FileInputStream in = null; GZIPOutputStream out = null; try { in = new FileInputStream(srcFile); out = new GZIPOutputStream(new FileOutputStream(target)); int number = 0; while ((number = in.read(B_ARRAY, 0, BUFFER)) != -1) { out.write(B_ARRAY, 0, number); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); }

                if (out != null) {
                 out.close();
                }
                

                } catch (IOException e) { e.printStackTrace(); } } }

                // / 方法功能:获得打包后文件的流 参数:targetFileName 打包后文件的路径 /*/ private TarOutputStream getTarOutputStream(String targetFileName) { // 如果打包文件没有.tar后缀名,就自动加上 targetFileName = targetFileName.endsWith(".tar") ? targetFileName : targetFileName + ".tar"; FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(targetFileName); } catch (FileNotFoundException e) { e.printStackTrace(); } BufferedOutputStream bufferedOutputStream = new BufferedOutputStream( fileOutputStream); TarOutputStream out = new TarOutputStream(bufferedOutputStream);

                // 如果不加下面这段,当压缩包中的路径字节数超过100 byte时,就会报错 out.setLongFileMode(TarOutputStream.LONGFILE_GNU); return out; }

                }

                InFixPostfix

                Posted on

                InFixPostfix

                Algorithm Gossip: 中序式转后序式(前序式)

                说明

                平常所使用的运算式,主要是将运算元放在运算子的两旁,例如a+b/d这样的式子,这称之为中序(Infix)表示式,对于人类来说,这样的式子很容易理 解,但由于电脑执行指令时是有顺序的,遇到中序表示式时,无法直接进行运算,而必须进一步判断运算的先后顺序,所以必须将中序表示式转换为另一种表示方 法。 可以将中序表示式转换为后序(Postfix)表示式,后序表示式又称之为逆向波兰表示式(Reverse polish notation),它是由波兰的数学家卢卡谢维奇提出,例如(a+b)/(c+d)这个式子,表示为后序表示式时是ab+cd+/

                解法

                用手算的方式来计算后序式相当的简单,将运算子两旁的运算元依先后顺序全括号起来,然后将所有的右括号取代为左边最接近的运算子(从最内层括号开始),最后去掉所有的左括号就可以完成后序表示式,例如: a+b/d+c/d => ((a+(b/d))+(c/d)) -> bd/*+cd/+ 如果要用程式来进行中序转后序,则必须使用堆叠,演算法很简单,直接叙述的话就是使用回圈,取出中序式的字元,遇运算元直接输出,堆叠运算子与左括号, ISP>ICP的话直接输出堆叠中的运算子,遇右括号输出堆叠中的运算子至左括号。

                演算法

                以下是虚拟码的运算法,\0表示中序式读取完毕: Procedure Postfix(infix) [ Loop [ op = infix(i) case [ :x = '\0': while (stack not empty) // output all elements in stack end return :x = '(': // put it into stack :x is operator: while (priority(stack[top]) >= priority(op)) [ // out a element from stack ] // save op into stack :x = ')': while ( stack(top) != '(' ) [ // out a element from stack ] top = top - 1 // not out '( :else: // output current op ] i++; ] ] 例如(a+b)/(c+d)这个式子,依演算法的输出过程如下: OP STACK OUTPUT ( ( - a ( a + (+ a b (+ ab ) - ab+ / / ab+ ( /( ab+ c /( ab+c + /(+ ab+c d /(+ ab+cd ) / ab+cd+ - - ab+cd+/* 如果要将中序式转为前序式,则在读取中序式时是由后往前读取,而左右括号的处理方式相反,其余不变,但输出之前必须先置入堆叠,待转换完成后再将堆叠中的 值由上往下读出,如此就是前序表示式。

                实作

                • C /#include /#include int postfix(char/); // 中序转后序 int priority(char); // 决定运算子优先顺序 int main(void) { char input[80]; printf("输入中序运算式:"); scanf("%s", input); postfix(input); return 0; } int postfix(char/ infix) { int i = 0, top = 0; char stack[80] = {'\0'}; char op; while(1) { op = infix[i]; switch(op) { case '\0': while(top > 0) { printf("%c", stack[top]); top--; } printf("\n"); return 0; // 运算子堆叠 case '(': if(top < (sizeof(stack) / sizeof(char))) { top++; stack[top] = op; } break; case '+': case '-': case '/': case '/': while(priority(stack[top]) >= priority(op)) { printf("%c", stack[top]); top--; } // 存入堆叠 if(top < (sizeof(stack) / sizeof(char))) { top++; stack[top] = op; } break; // 遇 ) 输出至 ( case ')': while(stack[top] != '(') { printf("%c", stack[top]); top--; } top--; // 不输出( break; // 运算元直接输出 default: printf("%c", op); break; } i++; } } int priority(char op) { int p; switch(op) { case '+': case '-': p = 1; break; case '/': case '/': p = 2; break; default: p = 0; break; } return p; }

                • Java public class InFix { private static int priority(char op) { switch(op) { case '+': case '-': return 1; case '/': case '/': return 2; default: return 0; } } public static char[] toPosfix(char[] infix) { char[] stack = new char[infix.length]; char[] postfix = new char[infix.length]; char op; StringBuffer buffer = new StringBuffer(); int top = 0; for(int i = 0; i < infix.length; i++) { op = infix[i]; switch(op) { // 运算子堆叠 case '(': if(top < stack.length) { top++; stack[top] = op; } break; case '+': case '-': case '/': case '/': while(priority(stack[top]) >= priority(op)) { buffer.append(stack[top]); top--; } // 存入堆叠 if(top < stack.length) { top++; stack[top] = op; } break; // 遇 ) 输出至 ( case ')': while(stack[top] != '(') { buffer.append(stack[top]); top--; } top--; // 不输出( break; // 运算元直接输出 default: buffer.append(op); break; } } while(top > 0) { buffer.append(stack[top]); top--; } return buffer.toString().toCharArray(); } public static char[] toPrefix(char[] infix) { char[] stack = new char[infix.length]; char op; StringBuffer buffer = new StringBuffer(); int top = 0; for(int i = infix.length - 1; i >= 0; i--) { op = infix[i]; switch(op) { // 运算子堆叠 case ')': if(top < stack.length) { top++; stack[top] = op; } break; case '+': case '-': case '/': case '/': while(priority(stack[top]) >= priority(op)) { buffer.append(stack[top]); top--; } // 存入堆叠 if(top < stack.length) { top++; stack[top] = op; } break; // 遇 ( 输出至 ) case '(': while(stack[top] != ')') { buffer.append(stack[top]); top--; } top--; // 不输出) break; // 运算元直接输出 default: buffer.append(op); break; } } while(top > 0) { buffer.append(stack[top]); top--; } return buffer.reverse().toString().toCharArray(); } public static void main(String[] args) { String infix = "(a+b)/(c+d)"; System.out.println( InFix.toPosfix(infix.toCharArray())); System.out.println( InFix.toPrefix(infix.toCharArray())); } }