package com.hongjindong.Stack;
public class calculate {
private int MaxSize = 20;
int[] AStack = new int[MaxSize];
int top = -1;
public void push(int Value) {//入栈
if (top >= MaxSize) {
System.out.println("The stack is full! ");
} else {
top++;
AStack[top] = Value;
}
}
public int pop() {//出栈
int temp;
if (top < 0) {
System.out.println("The stack is empty!");
return -1;
}
temp = AStack[top];
top--;
return temp;
}
public boolean IsOperator(int operator) {//判断是否是运算符
if (operator == 43 || operator == 45 || operator == 42
|| operator == 47)
return true;
else
return false;
}
public int Priority(int operator) {//判断优先级
if (operator == 43 || operator == 45)
return 1;
else if (operator == 42 || operator == 47)
return 2;
else
return 0;
}
public int TwoResult(int operator, int operand1, int operand2) {//两个数的运算
switch (operator) {
case 43:
return (operand2 + operand1);
case 45:
return (operand2 - operand1);
case 42:
return (operand2 * operand1);
case 47:
return (operand2 / operand1);//注意这里写表达式的顺序
}
return 0;
}
public static void main(String[] args) {
calculate Operator = new calculate();
calculate Operand = new calculate();
String Expression = "8*9-2*4";
int Position = 0;
int Operator1;
int Operand1 = 0;
int Operand2 = 0;
int Result = 0;
while (true) {
if (Operator.IsOperator((int) Expression.charAt(Position))) {//判断读入的是否是运算符
if (Operator.top != -1) {//如果运算符栈还有符号,判断两者的优先级
if (Operator.Priority((int) Expression.charAt(Position)) <= Operator
.Priority(Operator.AStack[Operator.top])) {//栈类的运算符优先级大,先计算
Operand1 = Operand.pop();
Operand2 = Operand.pop();
Operator1 = Operator.pop();
Operand.push(Operand.TwoResult(Operator1, Operand1,
Operand2));
}
}
Operator.push((int) Expression.charAt(Position));//运算符进栈
}
else {
Operand.push((int) Expression.charAt(Position) - 48);//整数进栈
}
Position++;
if (Position >= Expression.length())
break;
}
while (Operator.top != -1) {//出栈
Operand1 = Operand.pop();
Operand2 = Operand.pop();
Operator1 = Operator.pop();
Operand.push(Operand.TwoResult(Operator1, Operand1, Operand2));
}
Result = Operand.pop();
System.out.println("The expression result is :" + Result);
}
}
分享到:
相关推荐
这些算法基于分治思想,将大整数分解为较小的部分,然后递归地进行乘法,其复杂度低于朴素的O(n^2)算法,达到O(n^(log2(3)))或O(n^(log3(2)))。虽然它们仍然涉及递归,但在适当的数据规模下,相比于朴素算法,它们...
在本文中,我们将探讨如何基于C语言利用栈技术来实现一个智能计算器,它能处理包括加、减、乘、除、次方以及括号运算在内的各种数学运算。这个计算器还能智能地识别乘法符号,无论是"*"还是"x",并能处理浮点数和...
5. **ReverseCal.java** 文件可能是主程序,它包含了将中缀表达式转为逆波兰表达式的过程,以及基于栈的逆波兰表达式求值算法的实现。这个类可能有一个`calculate`方法,接收逆波兰表达式字符串作为输入,返回计算...
算法设计中,堆栈的创建是通过动态内存分配实现的,出入栈操作通过修改栈顶指针(top)完成。数字字符转换为整数,可以通过减去字符'0'的ASCII码值(即48)来实现。在进行计算时,首先会在运算符堆栈中压入一个特殊...
本项目是一个基于C语言实现的堆栈计算器,它可以处理包含括号在内的算式,并能检查并处理简单的计算错误。 首先,我们要理解堆栈的基本操作:压入(push)、弹出(pop)、查看顶部元素(peek)和检查堆栈是否为空...
在本课程设计中,我们将探讨如何使用Microsoft Foundation Classes (MFC) 来实现经典的24点算法。MFC 是微软为Windows平台开发的一种C++类库,它为开发者提供了构建图形用户界面(GUI)和系统服务的应用框架。24点算...
高精度算法源码可能包括大整数的表示、加法、减法、乘法和除法等函数的实现。 接下来,我们讨论“位运算”。位运算是指在计算机中对二进制位进行的操作,如按位与(&),按位或(|),按位异或(^),左移()和右移(>>)等...
标题 "C语言栈计算器.zip" 暗示了一个使用C语言实现的计算器程序,它可能包含了一个基于栈数据结构的算法来执行基本的数学运算。栈是一种“后进先出”(LIFO)的数据结构,常用于处理括号表达式、算术运算等计算问题...
本项目是基于Visual Studio 2013(VS2013)开发的一个C语言实现的逆波兰计算器,旨在提供一种基础的计算平台,支持基本的算术运算以及一些三角函数,同时也为用户提供了扩展功能的可能性。 首先,我们需要理解逆...
这篇文档名为“常见算法代码(全)”,是一个包含多种算法实现的Word文档,适用于ACM竞赛和C/C++编程。文档中的代码模板涵盖了基础的算法问题,如动态规划、图论、数学运算等,旨在帮助初学者理解和应用这些算法。 ...
### 知识点总结 #### 1. 二叉查找树转变成排序的双向链表 ...2. **位运算**:通过位运算实现加法操作。 **实现细节**: - 使用数学公式`n * (n + 1) / 2`直接计算。 - 或者通过位运算实现递归式的加法操作。
- 大整数运算:如大整数加法、乘法,用于处理超出常规整型范围的计算。 - 回文判断:检查一个数字或字符串是否正读反读都相同。 8. 数据结构: - 队列:先进先出(FIFO)的数据结构,如循环队列、链式队列。 - 栈...
虽然提供的代码片段没有完整展示24点算法的具体实现,但基于上述数据结构和方法,可以通过递归或迭代的方式生成所有可能的运算组合,并检查结果是否等于24。这种方法通常涉及深度优先搜索或回溯算法。 综上所述,这...
《妙趣横生的算法(C语言实现)》可作为算法入门人员的教程,也可以作为学习过C语言程序设计的人士继续深造的理想读物,也可作为具有一定经验的程序设计人员巩固和提高编程水平,查阅相关算法实现和数据结构知识的参考...
设计一个栈,要求能够实现O(1)时间复杂度的最小元素查询功能,需要使用辅助栈来存储当前栈的最小元素。当push新元素时,如果新元素小于等于当前最小元素,则将新元素同时压入辅助栈。当pop操作时,也将辅助栈的栈顶...
此外,还有其他一些设计题目,如整数加法问题,要求用双向循环链表实现任意长整数的加法;交通咨询模拟,用有向图寻找最短路径;车厢调度问题,解决所有可能的车厢序列;以及字符串查找和替换,涉及字符串处理和文件...
2. Rabin-Karp算法:基于滚动哈希的字符串匹配。 3. BM和Boyer-Moore-Horspool算法:进一步优化的字符串匹配算法。 五、计算几何 1. 线段树:处理区间查询和修改问题,如区间加法、区间求和。 2. 平面向量:用于...
- 运算逻辑:计算器内部的算法接收用户输入的数字,进行加法运算,并将结果返回到显示区域。这个过程涉及数值解析、错误处理和运算符优先级管理。 3. **实现方式**: - 基于事件驱动:计算器应用程序通常采用事件...
此外,还可以通过重复乘法或基于快速幂算法实现指数运算。 #### 三、数学预备知识 **2.1 数学基础知识** 这部分主要介绍了一些基本的数学概念和工具,这些对于理解和分析算法非常重要。例如,学生需要熟悉集合论...