排版有些问题,请谅解。。。
数据结构:下压栈
参考算法: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)面向过程编程——暂未想到简单有效的算法
(未完待续。。。)
来源:https://www.cnblogs.com/winterist/p/7512691.html