设计栈运用栈实现算法多项式的计算

运用栈设计算法实现多项式运算

思路如下
设计两个栈,一个栈为数字栈
一个栈为符号栈
表达式为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;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值