《算法》阅读笔记
书中双栈法的两个典型例子
基本步骤:创建运算符栈和操作数栈,遇到操作数和运算符分别入栈,忽略 “(”,遇到 “)”则弹出运算符和操作数进行运算,得到结果推入运算数栈
import java.util.Scanner;
import java.util.Stack;
public class Expr {
//简单起见,输入不省略任何符号
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s = input.next();
Stack<Character> op = new Stack<>();
Stack<Double> num = new Stack<>();
for(int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if(ch >= '0' && ch <= '9')
num.push(Double.parseDouble(ch + ""));
else if(ch == '+' || ch == '-' || ch == '*' || ch == '/')
op.push(ch);
else if(ch == ')') {
double op2 = num.pop();
double op1 = num.pop();
char opr = op.pop();
double result = 0;
switch(opr) {
case '+': result = op1 + op2;break;
case '-': result = op1 - op2;break;
case '*': result = op1 * op2;break;
case '/': result = op1 / op2;break;
}
num.push(result);
}
}
while(!op.empty()) {
double op2 = num.pop();
double op1 = num.pop();
char opr = op.pop();
double result = 0;
switch(opr) {
case '+': result = op1 + op2;break;
case '-': result = op1 - op2;break;
case '*': result = op1 * op2;break;
case '/': result = op1 / op2;break;
}
num.push(result);
}
System.out.println(num.pop());
}
}
import java.util.Scanner;
import java.util.Stack;
//1+2)*3-4)*5-6)))
public class Fix {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s = input.next();
Stack<String> op = new Stack<>();
Stack<String> expr = new Stack<>();
for(int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if(ch >= '0' && ch <= '9')
expr.push(ch + "");
else if(ch != ')')
op.push(ch + "");
else {
String opchar = op.pop();
String op2 = expr.pop();
String op1 = expr.pop();
String temp = "(" + op1 + opchar + op2 + ")";
expr.push(temp);
}
}
while(!op.empty()) {
String opchar = op.pop();
String op2 = expr.pop();
String op1 = expr.pop();
String temp = "(" + op1 + opchar + op2 + ")";
expr.push(temp);
}
while(!expr.empty())
System.out.println(expr.pop());
}
}
记录一下,便于回忆