1. /**
  2. * 使用栈存储后缀表达式
  3. * Create by Administrator
  4. * 2018/6/13 0013
  5. * 下午 2:25
  6. **/
  7. public class StackX {
  8.  
  9. private int maxSize;
  10. private char[] stackArray;
  11. private int top;
  12.  
  13. public StackX(int size) // 构造函数
  14. {
  15. maxSize = size;
  16. stackArray = new char[maxSize];
  17. top = -1;
  18. }
  19.  
  20. public void push(char j) // 将项目放在堆栈的顶部
  21. {
  22. stackArray[++top] = j;
  23. }
  24.  
  25. public char pop() // 从堆栈顶部取项
  26. {
  27. return stackArray[top--];
  28. }
  29.  
  30. public char peek() // 从堆栈顶部查看
  31. {
  32. return stackArray[top];
  33. }
  34.  
  35. public boolean isEmpty() // 如果栈为空,则为true
  36. {
  37. return (top == -1);
  38. }
  39.  
  40. public boolean isFull() // 如果堆栈已满 true
  41. {
  42. return (top == maxSize - 1);
  43. }
  44.  
  45. public int size() // return size
  46. {
  47. return top + 1;
  48. }
  49.  
  50. public char peekN(int n) // peek at index n
  51. {
  52. return stackArray[n];
  53. }
  54.  
  55. public void displayStack(String s) {
  56. System.out.print(s);
  57. System.out.print("Stack (bottom-->top): ");
  58. for (int j = 0; j < size(); j++) {
  59. System.out.print(peekN(j));
  60. System.out.print(' ');
  61. }
  62. System.out.println("");
  63. }
  64.  
  65. }

  

  1. /**
  2. * 使用栈存储计算过程结果
  3. * Create by Administrator
  4. * 2018/6/14 0014
  5. * 上午 10:37
  6. **/
  7. public class StackR {
  8. private int maxSize;
  9. private int[] stackArray;
  10. private int top;
  11.  
  12. public StackR(int size) // 构造函数
  13. {
  14. maxSize = size;
  15. stackArray = new int[maxSize];
  16. top = -1;
  17. }
  18.  
  19. public void push(int j) // 将项目放在堆栈的顶部
  20. {
  21. stackArray[++top] = j;
  22. }
  23.  
  24. public int pop() // 从堆栈顶部取项
  25. {
  26. return stackArray[top--];
  27. }
  28.  
  29. public int peek() // 从堆栈顶部查看
  30. {
  31. return stackArray[top];
  32. }
  33.  
  34. public boolean isEmpty() // 如果栈为空,则为true
  35. {
  36. return (top == -1);
  37. }
  38.  
  39. public boolean isFull() // 如果堆栈已满 true
  40. {
  41. return (top == maxSize - 1);
  42. }
  43.  
  44. public int size() // return size
  45. {
  46. return top + 1;
  47. }
  48.  
  49. public int peekN(int n) // peek at index n
  50. {
  51. return stackArray[n];
  52. }
  53.  
  54. public void displayStack(String s) {
  55. System.out.print(s);
  56. System.out.print("Stack (bottom-->top): ");
  57. for (int j = 0; j < size(); j++) {
  58. System.out.print(peekN(j));
  59. System.out.print(' ');
  60. }
  61. System.out.println("");
  62. }
  63. }

  

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4.  
  5. /**
  6. * Create by Administrator
  7. * 2018/6/13 0013
  8. * 下午 2:38
  9. **/
  10. public class InTOPost {
  11.  
  12. private StackX stackX;
  13. private StackR stackR;
  14. private String input;
  15. private String outPut = "";
  16.  
  17. public InTOPost(String in) {
  18. this.input = in;
  19. int stackSize = input.length();
  20. stackX = new StackX(stackSize);
  21.  
  22. }
  23.  
  24. /**
  25. * 中缀表达式转后缀表达式
  26. * @return
  27. */
  28. public String doTrans() {
  29. for (int i = 0; i < input.length(); i++) {
  30. char ch = input.charAt(i);//拿到每个字符
  31. stackX.displayStack("For " + ch + " ");
  32. switch (ch) {
  33. case '+':
  34. case '-':
  35. getOpera(ch, 1);
  36. break;
  37. case '*':
  38. case '/':
  39. getOpera(ch, 2);
  40. break;
  41. case ')':
  42. getParen(ch);
  43. break;
  44. case '(':
  45. stackX.push(ch);
  46. break;
  47. default:
  48. outPut = outPut + ch; //是数字将其写入输出
  49. break;
  50. }
  51. }
  52. while (!stackX.isEmpty()) {
  53. stackX.displayStack("While ");
  54. outPut = outPut + stackX.pop();
  55. }
  56. stackX.displayStack("End ");
  57. return outPut;
  58. }
  59.  
  60. private void getOpera(char opThis, int prec1) {
  61. while (!stackX.isEmpty()) {
  62. char opTop = stackX.pop();
  63. if (opTop == '(') {
  64. stackX.push(opTop);
  65. break;
  66. } else {
  67. int prec2;
  68. if (opTop == '+' || opTop == '-') {
  69. prec2 = 1;
  70. } else {
  71. prec2 = 2;
  72. }
  73. if (prec2 < prec1) {
  74. stackX.push(opTop);
  75. break;
  76. } else {
  77. outPut = outPut + opTop;
  78. }
  79. }
  80. }
  81. stackX.push(opThis);
  82. }
  83.  
  84. private void getParen(char ch) {
  85. while (!stackX.isEmpty()) {
  86. char chx = stackX.pop();
  87. if (chx == '(') {
  88. break;
  89. } else {
  90. outPut = outPut + chx;
  91. }
  92. }
  93. }
  94.  
  95. /**
  96. * 计算后缀表达式的结果
  97. * @param output
  98. * @return
  99. */
  100. public int doParse(String output) {
  101. stackR = new StackR(20); //新建堆栈
  102. char ch;
  103. int num1, num2, interAns;
  104. for (int i = 0; i < output.length(); i++) { //遍历后缀表达式的字符串
  105. ch = output.charAt(i); // 读取到每一个字符
  106. stackR.displayStack(ch + " ");
  107. if (ch >= '0' && ch <= '9') { // 判断是不是数字
  108. stackR.push((int) (ch - '0')); // 放入到栈里
  109. } else {
  110. num2 = stackR.pop(); // 如果不是数字,就从栈里取出两个数字
  111. num1 = stackR.pop();
  112. switch (ch) { // 判断是哪个运算符,并计算
  113. case '+':
  114. interAns = num1 + num2;
  115. break;
  116. case '-':
  117. interAns = num1 - num2;
  118. break;
  119. case '*':
  120. interAns = num1 * num2;
  121. break;
  122. case '/':
  123. interAns = num1 / num2;
  124. break;
  125. default:
  126. interAns = 0;
  127. }
  128. stackR.push(interAns); // 把计算结果放入栈里
  129. }
  130. }
  131. interAns = stackR.pop(); // 获得最终结果
  132. return interAns;
  133. }
  134.  
  135. /**
  136. * 获取用户输入
  137. * @return
  138. * @throws IOException
  139. */
  140. public static String getString() throws IOException {
  141. InputStreamReader isr = new InputStreamReader(System.in);
  142. BufferedReader br = new BufferedReader(isr);
  143. String s = br.readLine();
  144. return s;
  145. }
  146.  
  147. public static void main(String[] args) throws IOException {
  148. String input, output;
  149. while (true) {
  150. System.out.print("Enter infix: ");
  151. System.out.flush();
  152. input = getString();
  153. if (input.equals("")) {
  154. break;
  155. }
  156. InTOPost toPost = new InTOPost(input);
  157. output = toPost.doTrans();
  158. System.out.println("Postfix is " + output + "\n");
  159. int result = toPost.doParse(output);
  160. System.out.println("结果:" + result);
  161. }
  162. }

  运行测试:

请输入:  (4+2*3)/2

For ( Stack (bottom-->top):
For 4 Stack (bottom-->top): (
For + Stack (bottom-->top): (
For 2 Stack (bottom-->top): ( +
For * Stack (bottom-->top): ( +
For 3 Stack (bottom-->top): ( + *
For ) Stack (bottom-->top): ( + *
For / Stack (bottom-->top):
For 2 Stack (bottom-->top): /
While Stack (bottom-->top): /
End Stack (bottom-->top):
Postfix is 423*+2/

4 Stack (bottom-->top):
2 Stack (bottom-->top): 4
3 Stack (bottom-->top): 4 2
* Stack (bottom-->top): 4 2 3
+ Stack (bottom-->top): 4 6
2 Stack (bottom-->top): 10
/ Stack (bottom-->top): 10 2
结果:5

java学习之—使用栈实现字符串数字四则运算的更多相关文章

  1. Java学习总结:飘逸的字符串

    Java学习:飘逸的字符串 前言 相信不管我们运用Java语言来开发项目还是进行数据分析处理,都要运用到和字符串相关的处理方法.这个社会处处有着和字符串相关的影子:日志.文档.书籍等.既然我们离不开字 ...

  2. Java学习2_一些基础2_字符串_16.5.5

    接上一次的博客. 不可变字符串: Java中String类没有提供用于修改字符串的方法.如果想将greeting中的“Hello”改为“Help!”需要先提取所需要的的字符,然后再拼接.即 greet ...

  3. java学习笔记(三)字符串

    字符串String 创建方法: 一·通过new创建  String  str1= new String("abc"); 二 直接创建   String str2="abc ...

  4. Java学习日记-3 Character和字符串

    (先说几个小问题 1.在main方法中调用主类的其他方法时,必须先生成主类的对象 2.String s = new String("Hello") 生成了两个对象 3.熟用布尔+f ...

  5. Java学习笔记【五、字符串】

    String类 11种构造,不一一列举 常用方法 s.length() 返回字符串长度 s1.contact(s2) 连接s1.s2 String.format("aaa %f bbb %d ...

  6. Java学习笔记【一、环境搭建】

    今天把java的学习重新拾起来,一方面是因为公司的项目需要用到大数据方面的东西,需要用java做语言 另一方面是原先使用的C#公司也在慢慢替换为java,为了以后路宽一些吧,技多不压身 此次的学习目标 ...

  7. 【原】Java学习笔记022 - 字符串

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 字符串 // 定义 ...

  8. Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录)

    Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录) 作者:王可利(Star·星星) 效果图: 代码如下: class Star8 { public static void m ...

  9. 《Java数据结构与算法》笔记-CH4-2用栈实现字符串反转

    import java.io.BufferedReader; import java.io.InputStreamReader; //用栈来实现一个字符串逆序算法 /** * 数据结构:栈 */ cl ...

随机推荐

  1. UVA10603-Fill(BFS)

    Problem UVA10603-Fill Accept:1162  Submit:10693 Time Limit: 3000 mSec  Problem Description There are ...

  2. php 验证身份证号

    function validation_filter_id_card($id_card){ if(strlen($id_card)==18){ return idcard_checksum18($id ...

  3. springboot RestTemplate请求

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code   1.定义 RestTemplateConfig 配置类 @Configuratio ...

  4. 路飞学城-Python开发集训-第3章

    学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...

  5. (二 -3-3) 天猫精灵接入Home Assistant-自动发现Mqtt设备-自动生成配置信息

    http://www.hassmart.com/products/switches/#tab=config switch: - platform: mqtt name: keting state_to ...

  6. 一步一步和我学Apache JMeter

    一. Apache JMeter介绍 1. Apache JMeter是什么? Apache JMeter 是Apache组织的开放源代码项目,是一个100%纯Java桌面应用,用于压力测试和性能测量 ...

  7. 接口测试,获取登录后的cookies

    参见: http://www.cnblogs.com/testwang/p/6023394.html

  8. C# — 动态获取本地IP地址及可用端口

    1.在VS中动态获取本地IP地址,代码如下: 2.获取本机的可用端口以及已使用的端口:

  9. ASP.NET Core - 关于Tag Helper值得了解的五点

    如果您开发过ASP.NET Core Web应用程序,您应该已经熟悉了Tag Helper.ASP.NET Core应用程序依赖Tag Helper来呈现表单和表单字段是很常见的.所以,一个视图通常包 ...

  10. Ubuntu脚本修改IP信息

    #!/bin/bash cd /etc/network #清除4-9行 sed -i '4,9d' interfaces #在第3行添加网卡名称 sed -i "3a auto ${1}&q ...