说明:程序只是为了说明计算规则(思路),并未优化,可能还是存在一些BUG(未进行大量数据的反复验证),必有更好的实现方式!!!
另外,在计算过程中,由于采用int,因此对于如5/3*3并不是5,而是3,所以可能计算结果有点出入!!!
栈:先进后出
四则运算的运用:
①将中缀表达式转为后缀表达式
规则1:若出现的符号等级低于栈顶的表达式等级(如符号为'+或-',而栈顶为'*或/',则除顶部自己外其余全部出栈;若碰到同级则只出栈一个(如符号为'+',而栈顶为'-'且栈中还有'+-',则只出栈顶一个'-')
规则2:若出现左右括号,则括号内的内容全部出栈
规则3:非符号(即数字)不用进栈,只需依次记录即可
②入栈计算后缀表达式并得出结果
规则:类似"56*"则计算为5*6=30,然后30入栈继续计算
附上代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class Test {
public static void main(String[] args) {
//Test1
String str1[] = {"9","+","(","3","-","1",")","*","3","+","10","/","2"};
System.out.println(calculateInfixExpression(infixExpression2PostfixExpression(str1)));
//Test2
String str2[] = {"3","+","6"};
System.out.println(calculateInfixExpression(infixExpression2PostfixExpression(str2)));
//Test3
String str3[] = {"13","-","6","/","2","-","1","+","3","*","5","/","3"};
System.out.println(calculateInfixExpression(infixExpression2PostfixExpression(str3)));
//Test4
String str4[] = {"4","/","2","+","1","-","5","+","3","*","6","/","2"};
System.out.println(calculateInfixExpression(infixExpression2PostfixExpression(str4)));
}
//将中缀表达式转为后缀表达式
public static List<String> infixExpression2PostfixExpression(String str[]){
List<String> sb = new ArrayList<String>();
Stack<String> s = new Stack<String>();
for(int i=0;i<str.length;i++){
if(str[i].equals("+")||
str[i].equals("-")||
str[i].equals("*")||
str[i].equals("/")||
str[i].equals("(")||
str[i].equals(")")
){
if(s.contains("(")&&str[i].equals(")")){
s.push(str[i]);
Stack<String> ss = new Stack<String>();
ss.addAll(s);
int count = ss.size();
int removeCount = 0;
for(int m=0;m<count;m++){
String pop = ss.pop();
if((!(pop.equals("(")))&&
(!(pop.equals(")")))){
sb.add(pop);
removeCount++;
}else if(pop.equals("(")){
break;
}
}
//+2表示算上左右括号
for(int n=1;n<=(removeCount+2);n++){
s.pop();
}
}else if((str[i].equals("+")&&((s.isEmpty()?"":s.lastElement()).equals("*")||(s.isEmpty()?"":s.lastElement()).equals("/")))||
(str[i].equals("-")&&((s.isEmpty()?"":s.lastElement()).equals("*")||(s.isEmpty()?"":s.lastElement()).equals("/")))||
(str[i].equals("*")&&((s.isEmpty()?"":s.lastElement()).equals("/")))||
(str[i].equals("/")&&((s.isEmpty()?"":s.lastElement()).equals("*")))||
(str[i].equals("+")&&((s.isEmpty()?"":s.lastElement()).equals("-")))||
(str[i].equals("-")&&((s.isEmpty()?"":s.lastElement()).equals("+")))){
if((str[i].equals("+")&&(s.lastElement().equals("*")||s.lastElement().equals("/")))||
(str[i].equals("-")&&(s.lastElement().equals("*")||s.lastElement().equals("/"))) ){
s.push(str[i]);
String sss = "";
int length = s.size();
for(int k=0;k<length;k++){
if(k==0){
sss = s.pop();
}else{
sb.add(s.pop());
}
}
s.push(sss);
}else{
sb.add(s.pop());
s.push(str[i]);
}
}else{
s.push(str[i]);
}
}else{
sb.add(str[i]);
}
}
//最后还有剩余则出栈
int restLength = s.size();
for(int o=0;o<restLength;o++){
sb.add(s.pop());
}
return sb;
}
//将后缀表达式入栈计算并得出最终结果
public static String calculateInfixExpression(List<String> list){
System.out.println(list);
Stack<String> s = new Stack<String>();
for(int i=0;i<list.size();i++){
String data = list.get(i);
if(data.equals("+")||data.equals("-")||data.equals("*")||data.equals("/")){
int firstPop = Integer.parseInt(s.pop());
int secondtPop = Integer.parseInt(s.pop());
int result = 0;
switch(data){
case "+":
result = secondtPop+firstPop;
break;
case "-":
result = secondtPop-firstPop;
break;
case "*":
result = secondtPop*firstPop;
break;
case "/":
result = secondtPop/firstPop;
break;
}
s.push(String.valueOf(result));
}else{
s.push(data);
}
}
//最后应该总是还剩一个
return s.pop();
}
}
分享到:
相关推荐
在编程领域,四则运算的实现...通过这个过程,不仅可以学习到栈和队列的运用,还能加深对四则运算规则的理解。在压缩包中的`StackCalc`文件应该包含了完整的源代码实现,读者可以参考并实践,以更深入地掌握这个算法。
总结来说,"PB做的计算器(支持多则运算)"这个项目涵盖了PowerBuilder的基础使用、事件驱动编程、用户界面设计、数学运算逻辑实现、键盘事件处理、以及数据窗口的运用等多个方面的知识点。通过这样一个项目,开发者...
在C语言编程中,实现一个简易的计算器,特别是处理中缀表达式的四则混合运算,是一项常见的练习。这个任务涉及到字符串处理、字符解析、栈数据结构的运用以及运算符优先级的理解。以下将详细讲解这一过程中的关键...
- 支持基本的四则运算及括号运算。 - 表达式合法性检查:判断输入的字符是否符合数学表达式规则。 - 错误处理:如果输入的表达式非法,程序能够识别并给出相应提示。 - 清除与全清除功能:清除最近输入的数字或...
8. **模拟与暴力枚举**:对于一些简单的或特定的题目,直接模拟过程或者暴力遍历所有可能的解可能是最直观的方法,但需要注意时间和空间复杂性的控制。 9. **位操作**:在解决一些与整数操作相关的问题时,位操作...
- **四则运算**:程序需要实现加法(+)、减法(-)、乘法(*)和除法(/)操作。这些可以通过重载运算符函数或者单独的方法来完成。 - **优先级**:确保运算符的优先级得到正确处理,例如乘法和除法先于加法和...
这可能涉及到栈数据结构的运用,因为计算四则混合表达式通常采用逆波兰表示法(RPN)或中缀表达式的转换。 4. **错误处理**:计算器应该能处理各种异常情况,比如除以零、输入非法字符等。良好的错误处理机制可以...
3. 计算器:实现一个十进制四则运算计算器需要理解操作数和运算符的优先级。可以使用两个栈,一个存储数字,另一个存储运算符。遍历输入的表达式,遇到数字时压入数字栈,遇到运算符时,根据运算符的优先级与栈顶...
本项目选择了两个经典实例:手机通讯录模拟和24点扑克牌游戏,这两个主题都是很好的数据结构应用场景,能充分展示链表、树、排序等基本数据结构的运用。 首先,让我们关注手机通讯录模拟。通讯录是一个存储联系人...
1. 算术表达式求值:利用后缀表达式(逆波兰表示法)和栈,实现四则运算。栈用于存储操作数和运算符,根据运算符优先级进行计算。 2. 运动员混合双打组合:使用队列模拟运动员的配对过程,每次从队首取出一对进行...
本项目旨在帮助学生掌握基础的编程概念,特别是涉及四则运算和数据结构的运用。我们将讨论以下几个方面: 1. **项目概述** - 目标是构建一个名为myCalculator的计算器程序,它能处理连续的数学运算,如4+5+6或5*8+...
它可以支持基本的四则运算(加、减、乘、除),同时涵盖了更高级的数学函数,例如指数、对数、三角函数(正弦、余弦、正切)、反三角函数、平方根、立方根等。此外,它还可能支持复数运算、矩阵计算以及统计和概率...
1. **数据结构**:理解并能灵活运用链表、树、图、堆、栈、队列等基本数据结构,以及排序和搜索算法,如冒泡排序、快速排序、二分查找等。 2. **算法**:深入学习贪心、动态规划、回溯、分治等算法思想,并能解决...
1. **极限与连续**:理解函数的极限概念,掌握极限的四则运算规则,能求解多元函数的极限,理解函数的连续性及其性质。 2. **导数与微分**:掌握导数的几何意义和物理意义,会求函数的一阶、二阶导数,利用导数判断...
该程序是设计用来实现“速算24”的...总的来说,这个程序巧妙地运用了栈这一数据结构来解决速算24游戏的计算问题,通过中缀转后缀和栈的运算,使得计算过程变得简单且高效。此外,它还结合了图形界面,增强了用户体验。
设计一个算术表达式求解器,需要解析输入的字符序列,处理四则运算。这通常使用栈来实现,遇到运算符时进行相应的计算,遇到数字则压入栈中,最后得到结果。 交通咨询模拟问题利用有向图表示城市的交通网络,寻找从...
这个游戏的规则简单而富有深意:玩家需从四张1到13的扑克牌中,通过加减乘除、括号等基本算术运算,使得结果恰好等于24。今天我们将深入探讨24点算法以及其中涉及到的算术运算算法。 首先,24点算法的核心在于如何...
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后...
在本文中,我们将深入探讨如何使用C#编程语言构建一个功能丰富的计算器,涵盖四则运算、符号处理、平方根、指数运算、对数函数、自然对数以及三角函数等核心功能。C#是一种广泛用于开发桌面应用、Web应用以及游戏...
16. 简单计算器:实现基本的四则运算,需要理解运算符优先级,可能涉及栈的数据结构。 17. 计算24游戏:涉及到数学逻辑和递归算法,找到数字组合成24的路径。 18. 输入盘子数:可能是汉诺塔问题,需要理解递归算法...