【数据结构算法】如何使用栈计算后缀表达式

无聊写的一个使用栈计算后缀表达式的代码:

初次写,只有+-*/四个运算符,后面可以自己加,都差不多就是个算术运算符优先级的问题。

主函数:包括初始化*+-/符号,判断输入的字符是操作数还是运算符。

/**
 * !!!!!(栈相关测试)
 * @author WZ
 *
 */
package MyCollection;

public class Test01 {
	/**
	 * 使用栈计算后缀表达式
	 * 
	 * @author WZ
	 *
	 */
	class CalPostfixExpressionByStack {

		private static final char ADD = '+';
		private static final char SUB = '-';
		private static final char MUL = '*';
		private static final char DEV = '/';

		MyStack stack1;

		public CalPostfixExpressionByStack() {
			stack1 = new MyStack();
		}

		public Object Scan(String expr) {
			int op1 = 0;
			int op2 = 0, result = 0;
			String token;
			Scanner scanner = new Scanner(expr);
			// System.out.println(scanner.next().charAt(1));
			while (scanner.hasNext()) {
				token = scanner.next();// next()不回录入空格
				if (isOperator(token)) {
//					if (stack1.peek() instanceof Integer) {这里是错误的,因为栈中的其他元素依然是String对象,String对象无法强转成为Integer。
//						op1=(Integer) stack1.pop();
//						op2=(Integer) stack1.pop();
//					}
						op1 = (int) stack1.pop();
						op2 = (int) stack1.pop();				
					result = CalSingleOperator(token.charAt(0), op1, op2);
					stack1.push(result);
				} else {
					if (token instanceof String) {
						stack1.push(Integer.parseInt(token));//只要读入的的是String对象,直接转成Integer对象,避免后面的运算混乱
						
					}
				}
			}
			return result;

		}

		public int CalSingleOperator(char operator, int op1, int op2) {
			int result = 0;
//			Integer opp1=Integer.valueOf((String) op1);
//			Integer opp2=Integer.valueOf((String) op2);
//			Number number1 = (Number) op1;
//			Number number2 = (Number) op2;
//			int opp1 = number1.intValue();
//			int opp2 = number2.intValue();
			switch (operator) {
			case ADD:
				result = op2 + op1;
				break;
			case SUB:
				result = op2 - op1;
				break;
			case MUL:
				result = op2 * op1;
				break;
			case DEV:
				result = op2 / op1;
				break;

			default:
				break;
			}
			return result;
		}

		public boolean isOperator(String token) {
			return (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/"));
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// MyStack m=new MyStack();
		// char c='*';
		// m.push(c);
		// System.out.println(m.pop());
		/
		// String[] s1={"111","2222","333"};
		Test01 t1 = new Test01();
		// QueueWithTowStack queueWithTowStack=t1.new QueueWithTowStack();
		// for (int i = 0; i < s1.length; i++) {
		// queueWithTowStack.enQueue(s1[i]);
		// }
		//
		// queueWithTowStack.isEmpty();
		// System.out.println(queueWithTowStack.deQueue());
		// System.out.println(queueWithTowStack.deQueue());
		// System.out.println(queueWithTowStack.deQueue());
		///
		String exression;
		Object result;
		Scanner scanner = new Scanner(System.in);

		CalPostfixExpressionByStack c = t1.new CalPostfixExpressionByStack();
		System.out.println("请输入一个后缀表达式:");
		System.out.println("例如123*+5-");
		exression = scanner.nextLine();
		result = c.Scan(exression);
		System.out.println("结果为:" + result);
	}

}

自己定义的Stack,有基本的功能就够了......本人懒水平也不是很高。。。。

package MyCollection;

public class MyStack {
	private Object[] objects;
	private int top;
	
	public MyStack() {
		this(10);
	}
	
	public MyStack(int maxsize) {
		objects=new Object[maxsize];
		top=0;
	}
	
	public void push(Object obj) {
		objects[top++]=obj;
	}
	
	public Object pop() {
		return objects[--top];
	}
	
	public boolean isEmpty() {
		return top==0; 
	}
	
	public void disPlay() {
		for (int i = top-1; i >=0; i--) {
			System.out.println(objects[i]);
		}
	}
	
	public Object peek() {
		return objects[top-1];
	}
	
	public int size(){
		return top;
	} 
	public Object[] getObjects() {
		return objects;
	}
	public void setObjects(Object[] objects) {
		this.objects = objects;
	}
}

最后是一个输出(哈哈哈哈火火吼吼...) 

请输入一个后缀表达式:
例如123*+5-
1 2 3 * + 5 -
结果为:2

 

就这么多了。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,数据结构中的和队列可以用来实现中缀表达式求值算法。中缀表达式是我们最为常见的表达式,运算符号位于参与运算的两个操作数中间的表达式称作中缀表达式。中缀表达式的求值算法可以通过将中缀表达式转换为后缀表达式,然后再利用来实现后缀表达式的求值。具体步骤如下: 1. 将中缀表达式转换为后缀表达式。可以使用来实现,具体步骤如下: a. 从左到右遍历中缀表达式的每个元素。 b. 如果当前元素是操作数,则将其输出到后缀表达式中。 c. 如果当前元素是左括号,则将其压入中。 d. 如果当前元素是右括号,则将中的元素弹出并输出到后缀表达式中,直到遇到左括号为止。 e. 如果当前元素是运算符,则将其与顶元素进行比较,如果顶元素优先级高于当前元素,则将顶元素弹出并输出到后缀表达式中,直到顶元素优先级低于或等于当前元素为止,然后将当前元素压入中。 f. 重复步骤a到e,直到遍历完中缀表达式。 2. 利用来实现后缀表达式的求值。具体步骤如下: a. 从左到右遍历后缀表达式的每个元素。 b. 如果当前元素是操作数,则将其压入中。 c. 如果当前元素是运算符,则将顶的两个元素弹出,进行运算,并将结果压入中。 d. 重复步骤a到c,直到遍历完后缀表达式。 e. 中最后剩下的元素即为后缀表达式的求值结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值