我的复习代码:
package stack;
public class Calculate2 {
public static void main(String[] args) {
String expression = "72*4-51+12/4";
Stack2 ns = new Stack2(20);
Stack2 ss = new Stack2(20);
char ch = ' ';
String keepNum = "";
int index = 0;
int res = 0;
while (true){
ch = expression.charAt(index);
System.out.println("每一次扫描开始的ch值" + ch);
if(!ss.isOper(ch)){
keepNum += ch;
System.out.println("进入判断之前的keepNum" + keepNum);
if(index == (expression.length() - 1)){
ns.push(Integer.parseInt(keepNum));
System.out.println(Integer.parseInt(keepNum));
keepNum = "";
}else if(ss.isOper(expression.charAt(index + 1))){
ns.push(Integer.parseInt(keepNum));
keepNum = "";
}
}else{
if(ss.isEmpty()){
ss.push(ch);
}else if(ss.priority(ss.top()) < ss.priority(ch)){
ss.push(ch);
}else{
int num1 = ns.pop();
int num2 = ns.pop();
res = ss.cal(num1,num2,ss.pop());
ns.push(res);
ss.push(ch);
}
}
index ++;
System.out.println("index:" + index);
if(index == (expression.length())){
break;
}
}
while (true) {
int num1 = ns.pop();
int num2 = ns.pop();
res = ss.cal(num1,num2,ss.pop());
ns.push(res);
if(ss.isEmpty()){
break;
}
}
System.out.println(expression + " = " + ns.pop());
}
}
class Stack2 {
int top = -1;
int maxSize;
int[] stack;
public Stack2(int maxSize) {
this.maxSize = maxSize;
stack = new int[maxSize];
}
public boolean isEmpty() {
return top == -1;
}
public boolean isFull() {
return top == (maxSize - 1);
}
public void push(int m) {
if(isFull()){
System.out.println("栈已满");
return;
}
top++;
stack[top] = m;
}
public int pop() {
if(isEmpty()){
System.out.println("栈已空");
return -1;
}
int temp = stack[top];
top--;
return temp;
}
public void show() {
for (int i = top; i >= 0; i--) {
System.out.println("stack[" + i + "]=" + stack[i]);
}
}
public int top(){
return stack[top];
}
public int priority(int ch) {
if (ch == '*' || ch == '/') {
return 1;
} else if (ch == '+' || ch == '-') {
return 0;
} else {
return -3;
}
}
public boolean isOper(char ch) {
return ch == '*' || ch == '/' || ch == '+' || ch == '-';
}
public int cal(int num1, int num2, int ch) {
int res = 0;
if (ch == '*') {
res = num1 * num2;
System.out.println(num1 + "*" + num2 + "=" + res);
return res;
} else if (ch == '/') {
res = num2 / num1;
System.out.println(num2 + "/" + num1 + "=" + res);
return res;
} else if (ch == '+') {
res = num2 + num1;
System.out.println(num1 + "+" + num2 + "=" + res);
return res;
} else if (ch == '-') {
res = num2 - num1;
System.out.println(num2 + "-" + num1 + "=" + res);
return res;
}else{
return 0;
}
}
}
问题
- 空指针异常
- 解答:出栈入栈忘记判断栈空还是栈满,逻辑不清晰;不index++的迭代条件,放在了开头,导致后来重复使用的index都是错的,结果是中不正确
- 多位数读取失败,读取不了第二位
- 解答:说明拼接失败,误把keepNum的清空语句和拼接语句放到了同一个代码块,自然而然地就出现了拼接失败
- 出现空栈的异常!
- 扫描索引错误,致使符号栈正常,但是数栈少了一位,最后一位没有扫描进去
我居然不会debug!!!!!好像该犯的都犯了!!