java栈实现简易计算器算法

问题描述:

对于任意字符串,包含+ - * /和括号, 求出该表达式的值

首先百度该问题,网上有不少答案,但是实际思考,发现,很多答案没有考虑完全,例如:

-1+(-2)*3       遇到负号怎么办?

现贴出代码如下:

  1 package calcultor;
  2
  3 import java.util.Stack;
  4
  5 public class Calcultor {
  6
  7     static boolean isNumber(char x) {
  8         if (x >= ‘0‘ && x <= ‘9‘) {
  9             return true;
 10         }
 11         return false;
 12     }
 13
 14     static int priority(char x) {
 15         if (x == ‘+‘ || x == ‘-‘) {
 16             return 0;
 17         } else if (x == ‘*‘ || x == ‘/‘) {
 18             return 1;
 19         } else if (x == ‘(‘ || x == ‘)‘) {
 20             return -1;
 21         } else if (x == ‘#‘) {
 22             return -2;
 23         }
 24
 25         return -3;
 26     }
 27
 28     public static int calculte(String s) {
 29         Stack<Integer> number = new Stack<Integer>();
 30         Stack<Character> operate = new Stack<Character>();
 31         char top;
 32         int a = 0, b = 0;
 33         int j = 0;
 34         boolean flag = false;
 35         for (int i = 0; i < s.length(); ++i) {
 36             if (s.charAt(1) == ‘-‘) {
 37                 flag = true;
 38             }
 39             if (i >= 2 && i <= s.length() - 2) {
 40                 j = i;
 41                 if (!isNumber(s.charAt(j - 1)) && s.charAt(i) == ‘-‘ && isNumber(s.charAt(j + 1))) {
 42                     flag = true;
 43                 }
 44             }
 45             if (isNumber(s.charAt(i))) {
 46                 int Temp = 0;
 47                 String temp = "";
 48                 temp += s.charAt(i);
 49                 System.out.println("line 47 temp is " + temp);
 50                 while (isNumber(s.charAt(++i)))
 51                     temp += s.charAt(i);
 52                 System.out.println("line 50 temp is " + temp);
 53                 for (int jj = 0; jj < temp.length(); ++jj) {
 54                     Temp = Temp * 10 + temp.charAt(jj) - 48;
 55                 }
 56                 System.out.println("line 54 Temp is " + Temp);
 57                 if (flag) {
 58                     Temp *= -1;
 59                     flag = !flag;
 60                 }
 61                 number.push(Temp);
 62                 temp = null;
 63             }
 64             if (!isNumber(s.charAt(i))) {
 65                 if (((s.charAt(i) == ‘-‘) && !flag) || (s.charAt(i) != ‘-‘)) {
 66                     if (operate.empty()) {
 67                         operate.push(s.charAt(i));
 68                     } else {
 69                         top = operate.peek();
 70                         if (priority(s.charAt(i)) > priority(top) || s.charAt(i) == ‘(‘) {
 71                             operate.push(s.charAt(i));
 72                         } else {
 73                             while (priority(s.charAt(i)) <= priority(top)) {
 74                                 if (top == ‘#‘ && s.charAt(i) == ‘#‘) {
 75                                     int answer;
 76                                     operate.pop();
 77                                     answer = number.peek();
 78                                     number.pop();
 79                                     System.out.println("line 69 answer is " + answer);
 80                                     return answer;
 81                                 } else if (top == ‘(‘ && s.charAt(i) == ‘)‘) {
 82                                     ++i;
 83                                 } else {
 84                                     a = number.peek();
 85                                     number.pop();
 86                                     b = number.peek();
 87                                     number.pop();
 88                                     System.out.println("line 78 a is " + a + ", b is " + b);
 89                                 }
 90                                 if (top == ‘+‘) {
 91                                     b += a;
 92                                     number.push(b);
 93                                 } else if (top == ‘-‘) {
 94                                     b -= a;
 95                                     number.push(b);
 96                                 } else if (top == ‘*‘) {
 97                                     b *= a;
 98                                     number.push(b);
 99                                 } else if (top == ‘/‘) {
100                                     b /= a;
101                                     number.push(b);
102                                 }
103                                 operate.pop();
104                                 top = operate.peek();
105                             }
106                             System.out.println("line 96 s[i] is " + s.charAt(i));
107                             operate.push(s.charAt(i));
108                         }
109                     }
110                 }
111             }
112         }
113
114         return 0;
115     }
116
117     public static void main(String[] args) {
118         String s = new String("#(1+2)+(-2*2)+(-2*6)#");
119         int answer = calculte(s);
120         System.out.println("the answer is " + answer);
121     }
122 }
时间: 08-19

java栈实现简易计算器算法的相关文章

[java代码库]-简易计算器(第一种)

简易计算器(效果如图所示) 第一种方案:采用Javascript+html完成计算器,支持+-*/,结果显示不允许使用input输入域(可以考虑使用<span>) <html> <head> <title>简易计算器</title> <script language="javascript">//易错:不是"text/javascript" function doCal(){ //alert(d

[java代码库]-简易计算器(第二种)

第二种方案:在程序中不使用if/switch……case等语句,完成计算器功能. <html> <head> <title>简易计算器</title> <script language="javascript">//易错:不是"text/javascript" function doCal(){ var value1=parseInt(document.getElementById("value1

java 实现一个简易计算器

import java.util.Scanner;public class Test { public static void main(String[] args) { count(); } public static void count() { Scanner input1 = new Scanner(System.in); System.out.println("输入一个数"); double a = input1.nextDouble(); while (true) { Sc

java简易计算器

此小程序实现了计算器的基本功能: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SimpleCalc extends JFrame{ private static final long serialVersionUID = 1L; String[] labels = {"←","CE","±","√", "

JAVA计算器算法实现

import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class BorderJFrame extends JFr

java swing开发最简易计算器源代码

原文:java swing开发最简易计算器源代码 源代码下载地址:http://www.zuidaima.com/share/1550463496948736.htm 用java swing写的简易计算器 /** *@author www.zuidaima.com */ package com.zuidaima.swing; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; i

JAVA开发简易计算器界面-SWT

大家好,我是成都[LD],博客四年前就申请了,一直没打理,最近正好有时间,遂萌生了写技术博客的念头.我不得不感慨现在新技术更新很快,一不小心,就感觉自身就Out了.记得一年前,当时我也是在51CTO上了解到NoSQL和Hadoop这样的信息,当时就简单觉得很新奇,没想到一年之后发展如此迅速~~当然我这样说,并不是叫大家去追寻新技术,最根本的还是基础打牢靠,休息的时候多去了解下最新的IT动态.学习下前辈高手的一些技能~~打铁还需自身硬嘛! 我写博客的目的:一来是为了促进自身的进步,二来是为了希望与

JAVA(利用jsp+javabean+servlet)实现简易计算器

代码解释基本都在代码中给出 1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loo

Java(随笔)——利用HTML,CSS,JavaScript,JQuery编写的简易计算器

一.利用刚学过的前端知识做一个简易的计算器里边使用到了HTML,CSS,JavaScript以及JQuery的知识代码如下:(1)利用CSS设计了计算器外形样式:(2)利用JavaScript实现了建议计算器的功能:代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>简易计算器</title> <link rel="styl