栈实现中缀表达式
👉目的:实现计算一个计算式如(5 + 10 * 2 + 20 / 2)🕵️♂️🕵️♂️
👉思路:
- 通过一个 index 值(索引),来遍历我们的表达式
- 如果我们发现是一个数字, 就直接入数栈🗑🗑
- 如果发现扫描到是一个符号, 就分如下情况
(1) 如果发现当前的符号栈为空,就直接入栈🗑🗑
(2) 如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符, 就需要从数栈中pop出两个数,在从符号栈中pop出一个符号,进行运算,将得到结果,入数栈🗑🗑,然后将当前的操作符入符号栈, 如果当前的操作符的优先级大于栈中的操作符, 就直接入符号栈.🗑🗑
- 当表达式扫描完毕,就顺序的从数栈和符号栈中pop出相应的数和符号,并运行.
- 最后在数栈只有一个数字,就是表达式的结果
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
| import java.util.Scanner; public class Calculator { public static void main(String[] args) { System.out.println("请输入需要计算的表达式:"); Scanner scanner = new Scanner(System.in); String expression1 = scanner.nextLine(); String expression = expression1.trim(); ArrayStack2 numStack = new ArrayStack2(100); ArrayStack2 operStack = new ArrayStack2(100);
int index = 0; int num1 = 0; int num2 = 0; int oper = 0; int res = 0; char ch = ' '; String keepNum = ""; while (true) { ch = expression.substring(index, index + 1).charAt(0); if ( operStack.isOper(ch)) { if (!operStack.isEmpty()){ if (operStack.priority(ch) <= operStack.priority(operStack.peek())) { num1 = numStack.pop(); num2 = numStack.pop(); oper = operStack.pop(); res = numStack.cal(num1, num2, oper); numStack.push(res); operStack.push(ch); } else { operStack.push(ch); } }else { operStack.push(ch); }
} else { keepNum += ch; if (index == expression.length() - 1) { numStack.push(Integer.parseInt(keepNum)); } else { if (operStack.isOper(expression.substring(index + 1, index + 2).charAt(0))) { numStack.push(Integer.parseInt(keepNum)); keepNum = ""; } }
} index++; if (index >= expression.length()) { break; } } while (true) { if (operStack.isEmpty()) { break; } else { num1 = numStack.pop(); num2 = numStack.pop(); oper = operStack.pop(); res = numStack.cal(num1, num2, oper); numStack.push(res); } } System.out.println("表达式" + expression1 + " = " + numStack.pop()); } }
class ArrayStack2 { private int maxSize; private int [] stack; private int top = -1;
public ArrayStack2(int maxSize) { this.maxSize = maxSize; stack = new int[maxSize]; }
public boolean isFull() { return top == maxSize - 1; }
public boolean isEmpty() { return top == -1; }
public int peek() { return stack[top]; }
public void push(int value) { if (isFull()) { System.out.println("栈满"); return; } top++; stack[top] = value; }
public int pop() { if (isEmpty()) { throw new RuntimeException("栈空"); } int value = stack[top]; top--; return value; }
public void list() { if (isEmpty()) { System.out.println("栈空"); return; } for (int i = top; i >= 0; i--) { System.out.println("stack[" + i + "] = " + stack[i]); } }
public int priority(int oper) { if (oper == '*' || oper == '/') { return 1; } else if (oper == '+' || oper == '-') { return 0; } else { return -1; } }
public boolean isOper(char val) { return val == '+' || val == '-' || val == '*' || val == '/'; }
public int cal(int num1, int num2, int oper) { int res = 0; switch (oper) { case '+': res = num1 + num2; break; case '-': res = num2 - num1; break; case '*': res = num1 * num2; break; case '/': res = num2 / num1; break; default: break; } return res; }
}
|
结果展示:
1 2 3
| 请输入需要计算的表达式: 5 + 10 * 2 + 20 / 2 表达式5+10*2+20/2 = 35
|
加油!😘😘🎸🎸