文章插图
6 双栈运算这部分来自《算法(第四版)》 , 我觉得实在是相当不错 , 就放在这里了 , 算是张涨姿势吧
计算算式 `` 的值 , 我们使用两个栈来完成这个任务 , 一个栈用来保存运算符 , 一个栈用来保存操作数 。
表达式由括号、运算符和操作数组成 。我们根据以下4种情况从左到右逐个将这些实体送入栈处理:
- 将操作数压入操作数栈
- 将运算符压入运算符栈
- 忽略左括号
- 在遇到右括号时 , 弹出一个运算符 , 弹出所需数量的操作数 , 并将运算符和操作数的运算结果压入操作数栈
import JAVA.util.Stack;
public class Evaluate {
public static void main(String[] args) {
String str = "(1 + ( (2+3) * (4*5) ) )";
System.out.println(calculate(str));
}
public static double calculate(String str) {
Stack<String> ops = new Stack<String>();
Stack<Double> vals = new Stack<Double>();
for (int i = 0; i < str.length(); i++) {
String ele = "" + str.charAt(i);
// Neglect the operator "(" and " "
if (ele.equals("(") || ele.equals(" ")) ;
else if (ele.equals("+")) ops.push(ele);
else if (ele.equals("-")) ops.push(ele);
else if (ele.equals("*")) ops.push(ele);
else if (ele.equals("/")) ops.push(ele);
else if (ele.equals(")")) {
String op = ops.pop();
double v1 = vals.pop();
double v2 = vals.pop();
if (op.equals("+")) vals.push(v1 + v2);
if (op.equals("-")) vals.push(v1 - v2);
if (op.equals("*")) vals.push(v1 * v2);
if (op.equals("/")) vals.push(v1 / v2);
} else vals.push(Double.valueOf(ele));
}
return vals.pop();
}
}
这段Stack的用例使用了两个栈来计算表达式的值 。它展示了一种重要的计算模型:将一个字符串解释为一段程序并执行该程序得到结果 。有了泛型 , 我们只需实现Stack一次即可使用String值得栈和Double值得栈 。
文章插图
7 写在最后栈使用得场景相比较队列、链表会少一点 , 但是它的重要性一点不比它们差 , 所以一定需要认真得思考与总结 , 学习完只有进行总结 , 才能把知识变成自己的 。
【一小时搞定关于栈的那点事儿,其实挺简单的】
推荐阅读
- 干月季花茶的制作方法,关于购买玫瑰花茶要特别注意的两大情况
- 关于购买玫瑰花茶要特别注意的两大情况,玫瑰花茶泡水喝的功效
- 关于亲情的作文亲情记叙文5篇 亲情类记叙文
- 如何将5G大文件快速传给对方?1个小软件2分钟搞定
- 玩家|太疯狂!《艾尔登法环》新速通记录:7分钟内搞定
- 关于难忘的中秋节作文400字3篇 难忘的中秋节作文400字
- 关于感人的故事5篇 关于感动的故事
- 关于陪伴的暖心短句有哪些?
- 关于我的发现作文 我发现 作文
- 关于清明上河图邮票的探究