栈
定义
限制插入和删除只能在表的末端进行操作,也就是栈顶进行操作。符合先进后出的特点。Java中栈的实现是 通过数组。
例如:把1,2,3,4插入栈中,则存储结构如下:
栈的简单应用-计算器
代码如下:
import java.util.Stack;
/**
* 实现带括号的四则运算
*/
public class CalculatorUtil {
public static void main(String[] args) {
System.out.println(CalculatorUtil.Calculator("1+2*3.0+(1+1*3)+5"));
}
public static double Calculator(String expression){
char[] chars = expression.toCharArray();
//存储计算结果
Stack<Double> result=new Stack<>();
//存储操作
Stack<Character> oper=new Stack<>();
//临时存储数值
StringBuilder num=new StringBuilder();
for(int i=0;i<chars.length;i++){
if(chars[i]=='+' || chars[i]=='-' || chars[i]=='*' || chars[i]=='/' ){
//数值存入结果栈,并先进行乘除操作
if(!oper.isEmpty() && (oper.peek()=='*' || oper.peek()=='/')){
dealSum(oper.pop(),result,result.pop(),Double.parseDouble(num.toString()));
}else {
result.push(Double.parseDouble(num.toString()));
}
//清空临时数值
num.setLength(0);
oper.push(chars[i]);
}else if(chars[i]=='('){
//存储左括号
oper.push(chars[i]);
}else if(chars[i]==')'){
char operLast;
//一致进行出栈操作直到遇到左括号
while ((operLast=oper.pop())!='('){
dealSum(operLast,result,result.pop(),result.pop());
}
}else {
//拼接数值
num.append(chars[i]);
}
}
if(num.length()>0){
result.push(Double.parseDouble(num.toString()));
}
//将剩余的操作出栈
while (!oper.isEmpty()){
dealSum(oper.pop(),result,result.pop(),result.pop());
}
return result.peek();
}
private static void dealSum(char oper,Stack<Double> result,double numFirst,double numSecond){
switch (oper){
case '+':
result.push(numFirst+numSecond);
break;
case '-':
result.push(numFirst-numSecond);
break;
case '*':
result.push(numFirst*numSecond);
break;
case '/':
result.push(numFirst/numSecond);
break;
}
}
}
例如: 1+2.0*3+(1+1*3)+5
把输入的字符串转为字符数组,我们通过两个栈进行操作,result存储计算结果,operate存储操作。
第1轮操作
result: [1]
operate:[]
第2轮操作
result: [1]
operate:[+]
第3轮操作
result: [1,2.0]
operate:[+]
第4轮操作
result: [1,2.0]
operate:[+,*]
第5轮操作
result: [1,6.0]
operate:[+]
第6轮操作
result: [1,6.0]
operate:[+,+]
第7轮操作
result: [1,6.0]
operate:[+,+,(]
第8轮操作
result: [1,6.0,1]
operate:[+,+,(,+]
第9轮操作
result: [1,6.0,1,1]
operate:[+,+,(,+]
第10轮操作
result: [1,6.0,1,1]
operate:[+,+,(,+,*]
第11轮操作
result: [1,6.0,1,1,3]
operate:[+,+,(,+,*]
第12轮操作
result: [1,6.0,4]
operate:[+,+]
第13轮操作
result: [1,6.0,4]
operate:[+,+,+]
第14轮操作
result: [1,6.0,4,5]
operate:[+,+,+]
第15轮操作
result: [1,6.0,9]
operate:[+,+]
第16轮操作
result: [1,15.0]
operate:[+]
第17轮操作
result: [16.0]
operate:[]