关于真分数四则运算算法
排版有些问题,请谅解。。。
数据结构:下压栈
参考算法:Dijkstra双栈算数表达式求值算法、GCD算法(求最大公约数)、逆波兰表达式
1.Dijkstra双栈算数表达式求值算法:
引自《算法》第四版 作者: 塞奇威克 (Robert Sedgewick) / 韦恩 (Kevin Wayne)
本质:操作数栈 运算符栈 忽略左括号 遇右括号弹出运算符、弹出所需数量操作数、将运算结果压入操作数栈
2.GCD算法:
别名:辗转相除法、欧几里得算法
因为以前写过一个C语言实现,直接po上来吧
#include "stdafx.h"
int _GCD(int m, int n);
int main(void)
{
int x, y;
int GCD;
int a, b;
scanf_s("%d/%d", &x, &y);
GCD = _GCD(x, y);
a = x / GCD;
b = y / GCD;
printf("%d/%d", a, b);
return 0;
}
int _GCD(int m, int n)
{
int d;
for (;;) {
if (n == 0) {
break;
}
else {
d = m%n;
m = n;
n = d;
}
}
return m;
}
3.逆波兰表达式
表达式
逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:
正常的表达式 逆波兰表达式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
-- 引用自百度百科
4.实现思路
(1)改双栈为三栈——运算符栈、分子栈、分母栈
(2)双栈——运算符栈+字符串栈(存分数)
(3)重载运算符号(override)——可能比较复杂,需要用到面向对象编程语言,java中一切都是对象,运算符号也是被封装的类,我觉得应该可行
(4)面向过程编程——暂未想到简单有效的算法
(未完待续。。。)