没有合适的资源?快使用搜索试试~ 我知道了~
新的知识,新的开始。 接下来一起探讨使用Android技术解决计算器诸多问题,首先这个方法并不是适合所有人,有数据结构基础的同学可以稍微看看。 一般实现Android计算器都是只能进行例如 x + y = z的操作,但是需要实现类似于a + b * c = d的操作需要使用到逆波兰式。 下面解释一下逆波兰式的功能,人类认识中缀表达式,例如a+b*c,但是计算机只会按部就班的操作(a+b)*c,这样就与我们的目的背道而驰了,所以我们得将中缀表达式转化为后缀表达式,观察如下表格: 中缀表达式 后缀表达式 a+b*c abc*+ a*b+c ad*c+ 我们所知 ÷× 的优先级比
资源推荐
资源详情
资源评论
Android实践实践(计算器的数据结构实现计算器的数据结构实现)
新的知识,新的开始。
接下来一起探讨使用Android技术解决计算器诸多问题,首先这个方法并不是适合所有人,有数据结构基础的同学可以稍微看
看。
一般实现Android计算器都是只能进行例如 x + y = z的操作,但是需要实现类似于a + b * c = d的操作需要使用到逆波兰式。
下面解释一下逆波兰式的功能,人类认识中缀表达式,例如a+b*c,但是计算机只会按部就班的操作(a+b)*c,这样就与我们的
目的背道而驰了,所以我们得将中缀表达式转化为后缀表达式中缀表达式转化为后缀表达式,观察如下表格:
中缀表达式 后缀表达式
a+b*c abc*+
a*b+c ad*c+
我们所知 ÷× 的优先级比的优先级比 + – 高高。那我们如何使用后缀表达式呢?看如下图
栈底—–>栈顶
a 没有两个数字
ab 有两个数字则需要评判下一位是不是运算符
abc 显然下一位并不是运算符,则再次评判下一位
abc* 这里可以运行b*c = z操作并压入栈中
az 继续评判
az+ 运算完成 (b*c)+a
下来我们看一下该代码是如何实现的。
static Stack op = new Stack();
public static Float getv(char op, Float f1, Float f2) {
if (op == '+') return f2 + f1;
else if (op == '-') return f2 - f1;
else if (op == '*') return f2 * f1;
else if (op == '/') return f2 / f1;
else return Float.valueOf(-0);
}
public static float calrp(LinkedList rp) {
Stack v = new Stack();
int len = rp.size();
for (int i = 0; i < len; i++) {
InnerOperateChar ch =rp.get(i);
//如果是数字则压栈
if (ch.isNum()) v.push(Float.parseFloat(ch.getNumber()));
//非数字进行操作压栈
else v.push(getv(ch.getOperater(), v.pop(), v.pop()));
}
return v.pop();
}
那我们再往前推进,如何生成后缀表达式呢?
我们仔细观察一下中缀转化为后缀的过程中缀转化为后缀的过程。
a+b*c -----> abc*+
元素位置不变,则说明遇见数字则直接加入结果行列,那遇见运算符呢?
接下来一步一步进行模拟。
result op(栈) 操作讲解
a a直接加入result
a + +入栈
ab + b直接加入result
ab +* *入栈
ab* + *出栈
ab*c + c直接加入result
ab*c+ +出栈
过程捕捉:过程捕捉:在遇见+-运算时候需要将之前的op栈的元素弹出并加入至result中 ,在遇见*/运算符时,与之前的操作一直,不过
遇见同等运算等级的弹出元素需要停止。
以下是Java源程序。
public static LinkedList getrp(LinkedList s) {
int len = s.size();
LinkedList result = new LinkedList();
for (int i = 0; i < len; i++) {
InnerOperateChar ch = s.get(i);
if (ch.isNum()) {
result.add(ch);
} else if (!ch.isNum()) {
//如果是运算符的话
char oppo = ch.getOperater();
if (oppo == '+' || oppo == '-') {
while (!op.empty()) {
result.add(op.pop());
}
op.push(ch);
}
if (oppo == '*' || oppo == '/') {
while (!op.empty() && op.peek().getOperater() == '*') {
result.add(op.pop());
}
op.push(ch);
}
}
}
while (!op.empty()) {
InnerOperateChar temp = op.pop();
result.add(temp);
}
return result;
}
接下来解析工程中的重要数据结构(即运算符与数字集合类)
如下为创建的过程,再次声明,这里的数据结构是为了简化后期程序的难度。
//添加数字
linkedList.add(new InnerOperateChar("1"));
//添加运算符
linkedList.add(new InnerOperateChar('-'));
package com.example.thirdlesson;
public class InnerOperateChar {
private String number;
private char operater;
private boolean isNum;
public InnerOperateChar(String number) {
this.number = number;
this.operater = '#';
this.isNum = true;
}
public InnerOperateChar(char operater) {
this.number ="#";
this.operater = operater;
this.isNum = false;
剩余12页未读,继续阅读
资源评论
weixin_38625098
- 粉丝: 6
- 资源: 905
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- UnsupportedClassVersionError(解决方案).md
- DOMUpdateError解决办法.md
- VerifyError(解决方案).md
- BlockingIOError.md
- NextTickError解决办法.md
- NSKeyValueCodingError如何解决.md
- ZipException(解决方案).md
- BrokenPipeError.md
- SSRHydrationError解决办法.md
- NSArgumentException如何解决.md
- NSConditionException如何解决.md
- JarException(解决方案).md
- ChildProcessError.md
- NSApplicationError如何解决.md
- DataFormatException(解决方案).md
- SSRRenderingError解决办法.md
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功