【编程题】简单的四则运算

问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注: 1、表达式只含 +, -, *, /,
(, ), 四则运算符
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
• 要求实现函数: 
int calculate(int len,char *expStr)
【输入】 int len: 字符串长度;
char *expStr: 表达式字符串;
【输出】 无
【返回】 计算结果

• 示例 
1) 输入:char *expStr = “1+4*5-8/3”
函数返回:19
2) 输入:char *expStr = “8/3*3”
函数返回:6

 1 package MyTest;
 2
 3 /**
 4  * 简单的四则运算,每个参与运算的数字都在0-9之间。
 5  */
 6
 7 import java.util.*;
 8
 9 public class FourOps {
10
11     public static void main(String[] args) {
12         Scanner in = new Scanner(System.in);
13         while(in.hasNext()){
14             String expretion = in.next();
15             int length = expretion.length();
16             int result = compute(length, expretion);
17             System.out.println(result);
18         }
19
20     }
21
22     /**
23      * 该函数有两个功能
24      * 1. 首先把一个正常的中缀表达式,转化为一个后缀表达式
25      * 2. 通过后缀表达式计算表达式的值
26      * @param length
27      * @param expretion
28      * @return
29      */
30     private static int compute(int length, String expretion) {
31         int result = 0;
32         List<Character> oneOps = new LinkedList<>();
33         oneOps.add(‘+‘);
34         oneOps.add(‘-‘);
35         LinkedList<Character> ops = new LinkedList<>(); //用作栈,前面一定也要是LinkedList
36         StringBuffer changedExp = new StringBuffer();
37         for(int i = 0; i < length; i++){
38             Character temp = expretion.charAt(i);
39             if(temp >= ‘0‘ && temp <= ‘9‘)
40                 changedExp.append(temp);
41             else{
42                 if(ops.isEmpty())
43                     ops.push(temp);
44                 else{
45                     if(temp == ‘(‘)
46                         ops.push(temp);
47                     else{
48                         if(oneOps.contains(temp)){
49 //                            if(ops.peek() != ‘(‘)
50                             //原来用的if,考虑在遇到+-的时候应该把栈里的运算法都pop出来,现在改用while
51                             while(!ops.isEmpty()){
52                                 if(ops.peek() == ‘(‘)
53                                     break;
54                                 changedExp.append(ops.pop());
55                             }
56                             ops.push(temp);
57                         }
58                         else if(temp != ‘)‘){
59                             ops.push(temp);
60                         }
61                         else{    //‘)‘的情况
62                             while(ops.peek() != ‘(‘){
63                                 changedExp.append(ops.pop());
64                             }
65                             ops.pop();
66                         }
67                     }
68                 }
69             }
70         }
71         while(!ops.isEmpty()){
72             changedExp.append(ops.pop());
73         }
74         String changedExpStr = changedExp.toString();
75         System.out.println(changedExpStr);    //输出转化后的后缀表达式
76
77         //用后缀表达式计算
78         LinkedList<Integer> nums = new LinkedList<>();
79         for(int i = 0; i < changedExpStr.length(); i++){
80             Character temp = changedExpStr.charAt(i);
81             if(temp >= ‘0‘ && temp <= ‘9‘){
82                 nums.push(temp-‘0‘);
83             }
84             else{
85                 int a = nums.pop();
86                 int b = nums.pop();
87                 switch(temp){
88                 case ‘+‘: nums.push(a+b); break;
89                 case ‘-‘: nums.push(b-a); break;
90                 case ‘*‘: nums.push(a*b); break;
91                 case ‘/‘: nums.push(b/a); break;
92                 }
93             }
94         }
95         result = nums.pop();
96         return result;
97     }
98
99 }
时间: 2024-10-29 19:10:21

【编程题】简单的四则运算的相关文章

牛客华为在线编程题----简单密码破解

首先题目如下: /** * * 假设渊子原来一个BBS上的密码为zvbo9441987,为了方便记忆,他通过一种算法把这个密码变换成YUANzhi1987, * 这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码. * * 他是这么变换的,大家都知道手机上的字母: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, * tuv--8 wxyz--9, 0--0,就这么简单,渊子把密码中出

[编程题] 简单错误记录

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号. 处理:1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加:(文件所在的目录不同,文件名和行号相同也要合并)2.超过16个字符的文件名称,只记录文件的最后有效16个字符:(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)3.输入的文件可能带路径,记录文件名称不能带路径 输入描述: 一行或多行字符串.每行包括带路径文件名称,行号,以空格隔开. 文件路径为window

[编程题] 四则运算

[编程题] 四则运算 题目描述 请实现如下接口 /* 功能:四则运算 * 输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}" * 返回:算术表达式的计算结果 */ public static int calculate(String strExpression) { /* 请实现*/ return 0; } 约束: pucExpression字符串中的有效字符包括['0'-'9'],'+','-', '*','/' ,'('

3211: 简单的编程题

3211: 简单的编程题 时间限制: 1 Sec  内存限制: 128 MB提交: 162  解决: 53[提交][状态][讨论版][命题人:lyh] 题目描述 编写一个程序,对于从键盘输入的2个整数m,n(n,m<=10^6),先输出较大者的个位数字,然后输出较小者的平方. 输入 10 50 输出 0 100 样例输入 10 50 样例输出 0 100 提示 long long int 在输入输出是用 %lld . #include<stdio.h> int main() { long

搜狐2016研发工程师编程题

1.[编程题]马戏团 搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演.考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等. 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题.小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列.

嵌入式考试Shell编程题

单片机与嵌入式系统考试Shell编程题库,简单地做了下. 9. 与题7类似,多了个乘法运算. #!/bin/bash # test1.sh # 2016.1.2 echo "Please input N student grade:" read -a grade for ((i=0;i<${#grade[@]};i++)) do if [[ ${grade[i]} -ge 90 ]] then grade[i]=5 elif [[ ${grade[i]} -ge 80 ]] th

编程题集

编程题集 ps: 如题目有错请及时反馈 2015/7/10    scanf.printf的基本用法.变量的定义和使用.C语言的各种运算符 ------------------------------------------------------------------------------------- 程序篇: #1编写一个程序,输出 "Hello World" . #2编写一个程序,实现简单的加减乘除运算. #3让用户输入两个整数,然后调换位置后输出. #4输入年,月,日,把

C++继承与多态编程题

要求编写一个简单的人员信息管理程序,具体要求如下: (1)程序涉及到五个类,分别是employee,technician,salesman,manager,salsemanager.这五个类的关系为:employee是顶层父类,technician,salesman,manager是employee的子类,salsemanager是salesman,manager的子类. (2)employee具有员工号,姓名,收入等属性,有设置姓名,获取姓名,获取员工号,获取收入等函数. (3)technic

算法是什么我记不住,But i do it my way. 解一道滴滴出行秋招编程题。

只因在今日头条刷到一篇文章,我就这样伤害我自己,手贱. 刷头条看到一篇文章写的滴滴出行2017秋招编程题,后来发现原文在这里http://www.cnblogs.com/SHERO-Vae/p/5882357.html.看了下,挺有意思,于是就想了想,又写了写,最终撸出来了.刚开始一看顿时感觉很熟悉,大学数据结构和算法课肯定讲过相关东西,什么深度搜索,广度搜索,最优路径,最优解...但是现在你让我说个一二三,我还就只记住几个名字,说不定名字都记错.我向来不喜欢死记东西,能查到的真的不想背下来,而