Java实现栈来做一个将中缀表达式转化为后缀表达式的程序,中缀表达式更符合我们的主观感受,后缀表达式更适合计算机的运算,下面直接上代码吧:

  1. package Character1;
  2. import java.util.Stack;
  3. public class Calculter {
  4. private static Stack<Object> shu = new Stack<Object>();
  5. private static Stack<Object> fu = new Stack<Object>();
  6. static String oldString = "(1+2)+2*(4-1)+6/3";
  7. public static void main(String[] args) {
  8. char[] chars = new char[oldString.length()];
  9. for (int i = 0; i < oldString.length(); i++) {
  10. chars[i] = oldString.charAt(i);
  11. }
  12. for (int i = 0; i < chars.length; i++) {
  13. if (isCaoZuoFu(chars[i])) {
  14. if (chars[i] == '(') {
  15. fu.add(chars[i]);
  16. }
  17. if (chars[i] == ')') {
  18. // System.out.println(fu);
  19. while ((char) fu.peek() != '(') {
  20. shu.add(fu.pop());
  21. }
  22. if ((char) fu.peek() == '(') {
  23. fu.pop();
  24. }
  25. // System.out.println(fu+"-----");
  26. while (fu.isEmpty() != true) {
  27. char temp = (char) fu.pop();
  28. fu.add(temp);
  29. if (temp == '*' || temp == '/') {
  30. shu.add(temp);
  31. fu.pop();
  32. } else {
  33. break;
  34. }
  35. }
  36. } else if (chars[i] == '*') {
  37. fu.add(chars[i]);
  38. } else if (chars[i] == '/') {
  39. fu.add(chars[i]);
  40. } else if (chars[i] == '+') {
  41. fu.add(chars[i]);
  42. } else if (chars[i] == '-') {
  43. fu.add(chars[i]);
  44. }
  45. } else {
  46. shu.add(chars[i]);
  47. }
  48. }
  49. // System.out.println(fu.toString());
  50. // System.out.println(shu.toString());
  51. System.out.println("原字符串是:"+oldString);
  52. System.out.println("------------------以上部分千万不要改动了");
  53. while(fu.isEmpty()!=true){
  54. shu.add(fu.pop());
  55. }
  56. System.out.println("操作符栈:"+fu.toString());
  57. System.out.println("操作数栈:"+shu.toString());
  58. System.out.println("----------------------中缀表达式转换为后缀表达式的结果!");
  59. int result=JiSuan(Reverse(shu));
  60. System.out.println("表达式最终答案:"+result);
  61. }
  62. public static int JiSuan(Stack<Object> stack){
  63. int result=0;
  64. Stack<Object>temp=new Stack<Object>();//存放后缀表达式的操作数的栈
  65. while(stack.isEmpty()!=true){
  66. if(!isCaoZuoFu((char)stack.peek())){
  67. temp.add(stack.pop());
  68. System.out.println(temp);
  69. }else{
  70. int o1=Integer.parseInt(temp.pop().toString());
  71. int o2=Integer.parseInt(temp.pop().toString());
  72. if(stack.isEmpty()!=true){
  73. if((char)stack.peek()=='+'){
  74. temp.add(o2+o1);
  75. }
  76. if((char)stack.peek()=='-'){
  77. temp.add(o2-o1);
  78. }
  79. if((char)stack.peek()=='*'){
  80. temp.add(o2*o1);
  81. }
  82. if((char)stack.peek()=='/'){
  83. temp.add(o2/o1);
  84. }
  85. stack.pop();
  86. }
  87. }
  88. }
  89. return (int) temp.peek();
  90. }
  91. public static Stack<Object> Reverse(Stack<Object> shu){
  92. Stack<Object> reverseStack=new Stack<Object>();
  93. while(shu.isEmpty()!=true){
  94. reverseStack.add(shu.pop());
  95. }
  96. System.out.println("来个反序:"+reverseStack);
  97. return reverseStack;
  98. }
  99. //此方法用于判断对应字符是不是操作符,其中case的数字是对应的ASCII码。
  100. public static boolean isCaoZuoFu(char b) {
  101. int temp = (char) b;
  102. switch (temp) {
  103. case 43:
  104. case 45:
  105. case 42:
  106. case 47:
  107. case 40:
  108. case 41:
  109. return true;
  110. default:
  111. return false;
  112. }
  113. }
  114. }

下面就是程序的运行结果:



由于时间匆忙,未来得及做注释,导致此程序可读性较差,还望读者取精华弃糟粕。也希望对我的书写中有错误的地方予以指正,旨在我们的共同进步!

Java实现栈之计算器的更多相关文章

  1. java技术栈:项目概述

    学习使用java到现在也有三年多了,这三年基本是以项目驱动的方式学习,有好有坏,个人觉得好处在于,有一个清晰的目标让你解决,这会让你学习非常迅速有效.当然坏处就是片面,不成体系.这种学习方式在学校以小 ...

  2. java applet初探之计算器

    这里是用java写的一个计算器,用appllet的方式在浏览器中运行,如果电脑上装有java运行环境jre就能一试.将html代码保存为*.html(名称能够自定),applettest编译为clas ...

  3. Ninja:Java全栈Web开发框架-Ninja中文网

    相信不少业界人士都还停留在SSh的时代 其实我想给大家推荐的一个轻量级框架那就是Ninja; Ninja是一个Java全栈Web开发框架,稳定.快速.非常高效. 商业价值 在你的下一个项目中,Ninj ...

  4. Java虚拟机栈和本地方法栈

    Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java ...

  5. 剑指Offer——Java实现栈和队列的互模拟操作

    剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列   题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型.   思路:其实就是把队列正常入 ...

  6. Java技术栈思维导图

    Java技术栈思维导图 Java IO流体系 设计模式

  7. java 虚拟机栈

    与程序计数器一样,Java虚拟机栈也是线程私有的,他的生命周期与线程相同.虚拟机栈描述的是Java执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口 ...

  8. 01.Java 开发简单的计算器

    难度为一般,适合具有 Java 基础和 Swing 组件编程知识的用户学习一. 实验介绍1.1 实验内容本次实验利用Java开发一个可以进行简单的四则运算的图形化计算器,会使用到 Java Swing ...

  9. 20155301第十一周java课栈程序

    20155301第十一周java课栈程序 内容一:后序表达式: abcde/-f+ 内容二:根据填充以下代码: import java.util.Scanner; public class MyDCT ...

随机推荐

  1. 迭代器&生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

  2. IF判断条件说明

    在Python中,任何非零整数都为true,0是false:判断条件也可以是任何序列(列表.元组.字符串):所有长度不为零的为true,否则为false,比如:空序列为false.简而言之:非0非空为 ...

  3. freemarker的使用

    一:freemarker是什么? freemarker是一个模板引擎,基于定义的模板和数据生成对应的文本(HTML,xml,java等),是一个生成文本的工具. 二:freemarker的使用方法 ( ...

  4. 一例完全理解vue 2.0 的slots 和 functional render

    https://jsfiddle.net/pronan/mjqpmw0u/ 通过调节plan="bbb"的值, 比如换成plan="children",你会发现 ...

  5. 整理的Java List Set Map是否有序,元素是否允许重复

    整理的Java List Set Map是否有序,元素是否允许重复的说明,如下图:

  6. [精简版]snowing snow

    CSS <style> body { background: #eee; } @keyframes mysnow { 0% { bottom: 100%; opacity: 0; } 50 ...

  7. RxJava(11-线程调度Scheduler)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51821940 本文出自:[openXu的博客] 目录: 使用示例 subscribeOn原理 ...

  8. bitbucket添加ssh key

    右上角头像->bitbucket settings->ssh keys 直接点击: https://bitbucket.org/account/user/.../ssh-keys/ 教程: ...

  9. Spark Scheduler模块源码分析之DAGScheduler

    本文主要结合Spark-1.6.0的源码,对Spark中任务调度模块的执行过程进行分析.Spark Application在遇到Action操作时才会真正的提交任务并进行计算.这时Spark会根据Ac ...

  10. Web服务,XFire的一个例子

    Web服务优点 互操作性:实现不同系统间的相互调用(语言无关.平台无关) Web服务是什么 Web 服务是一类应用程序,是能够用编程的方法通过Web调用来实现某个功能的应用程序 Web服务的体系结构 ...