栈应用--表达式求值

自定义栈结构

package cStack;

public class Stack {

	private int defaultSize = 10;

	protected Object[] objs;
	protected int top;// top的值是下一个要入栈的元素下标

	public Stack() {
		objs = new Object[10];
		top = 0;
	}

	public boolean isEmpty() {
		return top == 0;
	}

	public boolean isFull() {
		return top == defaultSize;
	}

	public void initStack() {
		top = 0;
	}

	public void push(Object obj) {
		if (isFull())
			System.out.println("栈满---");
		objs[top++] = obj;
	}

	public Object pop() {
		if (isEmpty()) {
			System.out.println("栈空-----");
			return null;
		}
		return objs[--top];
	}

	public Object getTop() {
		if (isEmpty()) {
			System.out.println("栈空-----");
			return null;
		}
		return objs[top - 1];
	}
}

理解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

java代码实现

package cStack;

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;

public class Demo {

	private static final Map<Character, Integer> OPS;

	private static final char table[][] = { //
			{ '>', '>', '<', '<', '<', '>', '>' }, // +
			{ '>', '>', '<', '<', '<', '>', '>' }, // -
			{ '>', '>', '>', '>', '<', '>', '>' }, // *
			{ '>', '>', '>', '>', '<', '>', '>' }, // /
			{ '<', '<', '<', '<', '<', '=', ' ' }, // (
			{ '>', '>', '>', '>', ' ', '>', '>' }, // )
			{ '<', '<', '<', '<', '<', ' ', '=' }, // #
	};

	static {
		OPS = new HashMap<>();
		OPS.put('+', 0);
		OPS.put('-', 1);
		OPS.put('*', 2);
		OPS.put('/', 3);
		OPS.put('(', 4);
		OPS.put(')', 5);
		OPS.put('#', 6);
	}

	public static void main(String[] args) {
		new Demo().demo3();
	}

	// 表达式求值4+5*6+(5-1*4)
	@Test
	public void demo3() {

		char[] data = "4-5*6+(1-1*4)#".toCharArray();

		// 1.定义两个栈,数字栈,运算符栈 ,运算符栈初始化为#
		Stack numS = new Stack();
		Stack optS = new Stack();
		optS.push('#');
		int i = 0;
		// 2.循环读取字符,循环条件为运算符栈顶不是#||新读取的字符也不是#(运算符只剩#,结束标记符)
		while ((char) optS.getTop() != '#' || data[i] != '#') {
			char c = data[i];
			// 3.如果是数字,压入数字栈中,读取下一个字符
			if (isNum(c)) {
				numS.push(c);
				i++;
			} else {// 4.是运算符,就取栈顶,和当前运算符比较
				char top = (char) optS.getTop();
				char flag = compareOpt(top, c);
				if (flag == '>') {
					// 4.1 > 取栈顶运算符,和两个数字,进行运算,结果压入数字栈
					int result = calculate((char) optS.pop(), new Integer(numS.pop() + ""),
							new Integer(numS.pop() + ""));
					numS.push(result);
					System.out.println(result);
				} else if (flag == '=') {
					// 4.2 = 就是两个(),(3)这种形式的,脱括号,弹出运算符栈顶,读取下个字符
					optS.pop();
					i++;
				} else {
					// 4.3 < 直接压入,读取下一个
					optS.push(c);
					i++;
				}
			}
		}
		// 2.2 运算结束,取出来栈顶结果
		System.out.println(numS.getTop());

	}

	@Test
	public void testmethod() {
		double result = calculate('/', 3, 5);
		System.out.println(result);
	}

	// 计算 num2 opt num1
	private int calculate(char opt, int num1, int num2) {
		System.out.print(num2 + " " + opt + " " + num1 +" = ");
		switch (opt) {
		case '+':
			return num2 + num1;
		case '-':
			return num2 - num1;
		case '*':
			return num2 * num1;
		case '/':
			return num2 / num1;
		default:
			throw new RuntimeException("无法计算");
		}

	}

	// 比较两个运算符的优先级
	private char compareOpt(char top, char c) {
		int l = OPS.get(top);
		int r = OPS.get(c);
		return table[l][r];
	}

	private boolean isNum(char c) {
		return c >= '0' && c <= '9';
	}

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值