[JAVA][HDU 1237][九度 1019][简单计算器]

本来以为是一道很简单的stack题目,居然花了四五十分钟来解决,JAVA本身就有stack的应用优势,但还是花了自己很多时间。。

提供一些要点吧:

1.首先是来自九度的测试案例

1 + 2

5

4 + 2 * 5 - 7 / 11

3

0 + 5

1 - 2 * 3 * 4 + 5 * 6

1 * 2 * 3 + 5 + 6 - 7 * 8 + 9 / 10

0 + 0 * 0

1 + 5 * 0

0 + 5

0

2.输入0时结束,但是运算到0的时候不结束,这个应该很容易排除

3.输出之前再检查一遍stack是否有残留,如果有就再次运算,直到operator的stack为空,num的stack只剩一个的情况即为结果,保留两位输出就行

4.利用float提交时出现WA,换用double就解决了。(似乎很多人都是错在这里)

5.在HDU的OJ提交的时候,利用System.out.printf()输出‘\n‘来换行的情况下出现PE,但是换成System.out.println()来换行直接AC了,都是一些小细节的问题

最后是sourcecode:

[java] view
plain
copyprint?

  1. import java.io.BufferedInputStream;
  2. import java.util.Scanner;
  3. import java.util.Stack;
  4. public class Main {
  5. public static char toChar(String str) {
  6. return str.charAt(0);
  7. }
  8. public static boolean isNumeric(String str) {
  9. for (int i = str.length(); --i >= 0;) {
  10. if (!Character.isDigit(str.charAt(i))) {
  11. return false;
  12. }
  13. }
  14. return true;
  15. }
  16. public static int prior(char op1, char op2)
  17. // compare the priority of 2 ops
  18. // return the higher priority op‘s num
  19. // if the priority is same return 0
  20. {
  21. if (op1 == ‘*‘ || op1 == ‘/‘) {
  22. if (op2 == ‘*‘ || op2 == ‘/‘) {
  23. return 0;
  24. } else {
  25. return 1;
  26. }
  27. } else {
  28. if (op2 == ‘*‘ || op2 == ‘/‘) {
  29. return 2;
  30. } else {
  31. return 0;
  32. }
  33. }
  34. }
  35. public static double cal(double num1, double num2, char op) {
  36. switch (op) {
  37. case ‘+‘:
  38. return (num1 + num2);
  39. case ‘-‘:
  40. return num1 - num2;
  41. case ‘*‘:
  42. return num1 * num2;
  43. case ‘/‘:
  44. return num1 / num2;
  45. }
  46. return 0;
  47. }
  48. public static void main(String[] args) {
  49. Scanner sc = new Scanner(new BufferedInputStream(System.in));
  50. String expression = sc.nextLine();
  51. while (!expression.equals("0")) {
  52. Stack<Character> op = new Stack<Character>();
  53. Stack<Double> num = new Stack<Double>();
  54. String element[] = expression.split(" ");
  55. for (int i = 0; i < element.length; i++) {
  56. if (isNumeric(element[i])) {// if the element searching is a num
  57. if (num.size() <= 1) {// if less than one num in the stack,push the num in
  58. num.push(Double.valueOf(element[i]));
  59. }
  60. } else {// if it is a operator
  61. if (op.isEmpty()) {// if the operator stack is empty push it in
  62. op.push(toChar(element[i]));
  63. } else {
  64. char op1 = op.peek();
  65. char op2 = toChar(element[i]);
  66. if (prior(op1, op2) <= 1) {// if the last operator is more prior
  67. double nextNum = num.pop();
  68. double lastNum = num.pop();
  69. num.push(cal(lastNum, nextNum, op.pop()));
  70. op.push(op2);
  71. } else if (prior(op1, op2) == 2
  72. // && i + 2 < element.length
  73. // && prior(toChar(element[i + 2]), op2) != 1
  74. ) {
  75. // if the new operator is more prior
  76. double nextNum = Double.valueOf(element[++i]);// get the next num
  77. double lastNum = num.pop();
  78. num.push(cal(lastNum, nextNum, op2));
  79. } else if (prior(op1, op2) == 2) {
  80. double nextNum = Double.valueOf(element[++i]);// get the next num
  81. double lastNum = num.pop();
  82. }
  83. }
  84. }
  85. }
  86. if (!op.empty()) {
  87. double nextNum = num.pop();
  88. double lastNum = num.pop();
  89. System.out.printf("%.2f", cal(lastNum, nextNum, op.pop()));
  90. System.out.println();
  91. } else if (num.size() == 1) {
  92. System.out.printf("%.2f\n", num.pop());
  93. System.out.println();
  94. }
  95. expression = sc.nextLine();
  96. }
  97. }
  98. }
时间: 2024-10-09 15:19:32

[JAVA][HDU 1237][九度 1019][简单计算器]的相关文章

九度[1103]二次方程计算器

1 # include<iostream> 2 # include<string> 3 # include<iomanip> 4 # include<cmath> 5 using namespace std; 6 int a=0,b=0,c=0; 7 void getPar(string s,int flag) 8 { 9 if(s=="0") return ; 10 int l=s.size(); 11 bool neg=true; 1

1019.简单计算器

题目描述:     读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 输入:     测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔.没有非法表达式.当一行中只有0时输入结束,相应的结果不要输出. 输出:     对每个测试用例输出1行,即该表达式的值,精确到小数点后2位. 样例输入: 1 + 2 4 + 2 * 5 - 7 / 11 0 样例输出: 3.00 13.36 Solution1: #include<

题目1019:简单计算器(栈的使用)

题目链接:http://ac.jobdu.com/problem.php?pid=1019 题目具体分析见:https://github.com/zpfbuaa/JobduInCPlusPlus   参考代码: // // 1019 简单计算器.cpp // oj // // Created by PengFei_Zheng on 04/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <st

HDU 1237 简单计算器

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12832    Accepted Submission(s): 4222 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整

HDU 1237 简单计算器(后缀式+栈)

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16351    Accepted Submission(s): 5604 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,

HDU 1237:简单计算器【栈】

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6429    Accepted Submission(s): 2044 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整

Hdu 1237简单计算器

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 21184    Accepted Submission(s): 7599 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整

hdu 1237 简单计算器 逆波兰~~

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13852    Accepted Submission(s): 4613 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,

hdu 1237 简单计算器(栈处理)

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 26553    Accepted Submission(s): 9626 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整