通过栈实现算术表达式的计算

本文介绍了如何利用栈来计算算术表达式。通过定义操作符优先级,解析算术表达式,扫描并处理操作符和操作数,最终得出计算结果。文中还提供了Java程序实现这一过程。
摘要由CSDN通过智能技术生成

最近在看数据结构的栈,其中有一节为栈应用到算术表达式的计算,接下来我讲举例说明如何用栈去计算,如有不对的地方,请各位大神指教。

1、定义操作符的优先级,"("作为栈顶操作符时优先级仅高于"=",")"作为栈顶操作符时优先级是最高的,"*"和"/"优先级一样,但是一个作为栈顶的一个作为当前的操作符,那么栈顶的操作符的优先级就大于当前的操作符的优先级,"+"和"-"类似,但"+"和"-"无论是栈顶还是当前的优先级都小于"*"和"/";

2、解析算术表达式。将算术表达式由字符串解析成每个元素;

3、扫描算术表达式,如果当前元素是操作数,则直接进操作数栈,如果当前元素是操作符,则从右操作符优先级列表中找到该操作符的优先级currentRank,并从左操作符优先级列表中找到栈顶操作符的优先级topRank,如果当前操作符优先级高于栈顶操作符优先级则当前扫描到的操作符直接进操作符栈;如果当前操作符优先级低于栈顶操作符优先级,则判断当前操作符是否为")",如果不为")",则栈顶操作符出栈,并且操作数栈先后出栈顶两个操作数,并利用出栈的操作符计算结果,并将结果压入操作数栈中,一直到当前操作符的优先级高于栈顶操作符的优先级截止,然后将当前操作符压入操作符栈中;如果为")",则栈顶操作符出栈,并且操作数栈先后出栈顶两个操作数,并利用出栈的操作符计算结果,并将结果压入操作数栈中,一直到栈顶操作符为"("截止,然后将"("出栈。

4、当算术表达式扫描完成之后,依次将操作符栈栈顶操作符出栈,并在同时将操作数栈栈顶两个操作数相继出栈,计算结果,将结果压入操作数栈中。

以上是整个计算步骤,下面是我自己编写的java程序。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;


public class Stack {


private static LinkedList<String> operandStack; //操作数栈,静态成员函数里的成员变量必须为static
private static LinkedList<String> operatorStack; //操作符栈
private static Map<String, Integer> operatorLRank; //左操作符优先级
private static Map<String, Integer> operatorRRank; //右操作符优先级
private static List<String> expList; //算术表达式列表
private static List<Integer> eTypeList; //每个元素的类型,0为数字,1为操作符
private static Set<Integer> indexSet; //操作符位置集合
public static void main(String[] args) {
String exp="5*2^(14+2*2-6*3)-(8-9*2)*2";
// String exp="2-(14+2*2-6*3)*3";

initStack();
initOperatorRanks();
analysis(exp);
scanExp();
System.out.println("计算结果: "+operandStack.getLast());
}

/**
* 初始化栈
*/
private static void initStack(){
operandStack=new LinkedList<String>();
operatorStack=new LinkedList<String>();
operatorLRank=new HashMap<String, Integer>();
operatorRRank=new HashMap<String, Integer>();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值