输入字符串“(10+20/2*3)/2+8”计算结果
1.首先我们要将“(10+20/2
3)/2+8”变成
“(,10,+,20,/,2,
,3,),/,2,+,8”
2.建两个栈,一个用于
操作符
(+,-,…)的入栈出栈(
栈op
)
一个用于
数值
的入栈出栈(
栈nu
)
3.
操作符出栈入栈规则
:
- 如果栈op为null直接进栈
-
如果栈op的栈顶为“
(
”直接进栈 -
如果栈op的栈顶为
操作符
如“+”等,我们就
判断要进栈的操作符的优先级****是否大于栈顶
的
操作符
优先级,
如果大于就进栈;否者就弹出栈顶
操作符
,直到栈顶
操作符
优先级小于就进栈
操作符
优先级。 -
如果进栈的操作符是“
)
”就一直将栈顶的操作符弹出;直到栈顶的操作符为“
(
”结束; - 最后判断栈op是否为空,如果不是就一直弹出栈顶;
3.
数字出栈入栈规则
:
- 如果是数字直接进栈
-
如果
栈op
有弹出的操作符
“?”
,那么
栈nu
就要 连续弹出栈“
n1
”和
n2
(
n1比n2先弹出
),通过某个函数进行计算(
n2 ? n1
),结果再进入
栈nu
;
中缀表达式计算(入栈出栈过程)
部分代码(有需要全部代码联系我)
public static void main(String[] args) {
String expression = "(10+20/2*3)/2+8";
try {
int result = expreess(expression);
System.out.println(result);
}catch(Exception e){
System.out.println("error!");
}
}
private static int expreess(String expression) {
ArrayStatck<Character> op= new ArrayStatck<>();//操作符栈
ArrayStatck<Integer> num= new ArrayStatck<>();//数字栈
expression=formation(expression);//在操作符两侧添加空格
String[] toke=expression.split(" ");//去除空格,将两个空格之间的字符存入toke数组
for (String tokes:toke){//循环遍历
if(tokes.length()==0)
continue;
else if(tokes.charAt(0)=='+'||tokes.charAt(0)=='-'){//要进入的是—或+
while(!op.isEmpty()&&(op.peek()=='+'||op.peek()=='-'||op.peek()=='/'||op.peek()=='*')){
operat(op,num);//操作函数
}
op.push(tokes.charAt(0));
}else if(tokes.charAt(0)=='*'||tokes.charAt(0)=='/'){
while(!op.isEmpty()&&(op.peek()=='/'||op.peek()=='*')){
operat(op,num);
}
op.push(tokes.charAt(0));
}else if (tokes.charAt(0)=='('){
op.push(tokes.charAt(0));
}else if(tokes.charAt(0)==')'){
while(op.peek()!='('){
operat(op,num);
}
op.pop();
}else{
num.push(new Integer(tokes));//new Integer(tokes)将字符转化为数
}
}
while(!op.isEmpty()){//栈是否为空,如果不是就一直弹出栈顶
operat(op,num);
}
return num.pop();
}
private static void operat(ArrayStatck<Character> op, ArrayStatck<Integer> num) {
int num1=num.pop();
int num2=num.pop();
char c=op.pop();
switch(c){
case '+':num.push(num2+num1);break;
case '-':num.push(num2-num1);break;
case '*':num.push(num2*num1);break;
case '/':num.push(num2/num1);break;
}
}
版权声明:本文为qq_45726776原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。