运用栈设计算法实现多项式运算
思路如下
设计两个栈,一个栈为数字栈
一个栈为符号栈
表达式为expression=100*3-190
‘可以更复杂,自由发挥’
首先将表达式变为字符数组,便于扫描扫描进度用index来表示
设计符号权值比较,在ArrayStack中设计,传参问题符号类型char类型可以直接用int类型来计算
设计ArrayStack中cal方法,用于表达式的计算
流程如下
算法代码栈数据结构等都如下
public class Test {//多位位表达式的运算
public static void main(String[] args) {
// String expression = "987*2*5-5+1-5+3-3";
String expression = "100*3+190";
char arr[] = expression.toCharArray();
System.out.println(Arrays.toString(arr));
ArrayStack numberStack = new ArrayStack(10);
ArrayStack operStack = new ArrayStack(10);
int index = 0;// 用于扫描
char num;
int pushnum=0;
while (index != arr.length) {
if (operStack.isOper(arr[index])) {
numberStack.push(pushnum);
pushnum=0;
if (operStack.isEmpty()) {
operStack.push(arr[index]);
} else if (operStack.priority( operStack.getTop()) >= operStack.priority(arr[index])) {
int ru;
ru = numberStack.cal(numberStack.pop(), numberStack.pop(), operStack.pop());
numberStack.push(ru);
operStack.push(arr[index]);
} else {
operStack.push(arr[index]);
}
} else {
// numberStack.push(arr[index]-'0');
pushnum=pushnum*10+arr[index]-'0';
}
index++;
// 处理末项
if (index==arr.length) {//说明是扫描到表达式最后一项了,处理末项要注意
int ru;
ru = numberStack.cal(numberStack.pop(),pushnum, operStack.pop());
numberStack.push(ru);
}
}
numberStack.list();
}
}
class ArrayStack {
private int maxSize;
private int stack[];
int top = -1;
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack = new int[this.maxSize];
}
// 栈满
public boolean isFull() {
return top == maxSize - 1;
}
// 栈空
public boolean isEmpty() {
return top == -1;
}
// 入栈
public void push(int d) {
// 先判断栈是否满
if (isFull()) {
System.out.println("栈满");
return;
}
top++;
stack[top] = d;
}
// 出栈
public int pop() {
if (isEmpty()) {
// 抛出异常的形式来处理
throw new RuntimeException("栈空,没有数据");
}
return stack[top--];// top先进行运算,运算完后进行减一
}
// 显示栈,遍历栈。遍历时,需要从栈顶开始显示
public void list() {
int j = top;
if (isEmpty()) {
System.out.println("栈空");
return;
}
while (j != -1) {
System.out.println(stack[j--]);
}
}
public int getTop() {
return stack[top];
}
// 返回运算符的优先级
public int priority(int opper) {
if (opper == '*' || opper == '/') {
return 1;
} else if (opper == '+' || opper == '-') {
return -1;
} else {
return -1;
}
}
public boolean isOper(int val) {
return val == '+' || val == '-' || val == '*' || val == '/';
}
// 计算方法
public int cal(int num2, int num1, int oper) {
// System.out.println(num1+"值"+num2+"值");
switch (oper) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
case '*':
return num1 * num2;
case '/':
return num1 / num2;
default:
break;
}
return 0;
}
}