题目:使用栈计算类似表达式:5+2*3-2 的计算结果
提示:简易计算器操作符号限于+,-,*,/的计算
分析思路:
1、创建一个数栈和一个符号栈,数栈用于存放数字,符号栈用于存放符号
2、创建一个索引index,用于遍历表达式
3、扫描表达式,如果是数字直接进入数栈,如果是符号,则需要进行判断。分两种情况,一是当符号栈如果为空,直接将符号入栈。二是不为空,先比较当前栈顶的符号与将要进栈的符号的优先级大小,如果将要进栈的操作符的优先级小,则将数栈的两个数弹出,符号栈的操作符弹出一个,并进行计算,计算之后的结果直接进入数栈,如果优先级大,就直接进栈。
4、扫描完表达式之后,就顺序的从数栈和符号栈顺序的弹出相应的数字和操作符,并进行计算。
5、当符号栈为空时,说明已经计算完了,此时留在数栈的只有一个数字,就是表达式计算之后的结果。
代码实现
package cn.mrlij.stack;
import java.util.Arrays;
import java.util.Scanner;
/**
* 使用数组实现栈
*
* @author dreamer
*
*/
public class ArrayStackDemo {
public static void main(String[] args) {
String express = "5011+2*3-2";
int index = 0;//定义一个索引值,用于遍历表达式
int num1 = 0;
int num2 = 0;
int res = 0;//计算结果
char ch = ' ';
int oper = 0;
String keepNum = "";
ArrayStack numStack = new ArrayStack(10);//创建一个数栈
ArrayStack operStack = new ArrayStack(10);//创建一个符号栈
while (true){
ch = express.substring(index,index+1).charAt(0);//不停的遍历操作符
//判断是否是操作符
if (operStack.isOper(ch)){
//判断当前符号栈是否有符号存在
if(!operStack.isEmpty()){
//不为空则判断优先级
if(operStack.priority(ch)<=operStack.priority(operStack.peek())){
//当优先级小于栈顶的值时候,弹出两个数栈的值进行计算
num1 = numStack.pop();
num2 = numStack.pop();
oper = operStack.pop();
res = operStack.cal(num1,num2,oper);
//计算以后将计算得到的值放入数栈
numStack.push(res);
//同时将此时的操作符放入符号栈
operStack.push(ch);
}else{
//优先级
operStack.push(ch);
}
}else{
//为空直接将符号入栈
operStack.push(ch);
}
}else {
keepNum += ch;
//处理多位数
if(express.length()-1 == index){
numStack.push(Integer.parseInt(keepNum));
}else {
if(operStack.isOper(express.substring(index+1,index+2).charAt(0))){
numStack.push(Integer.parseInt(keepNum));
keepNum = "";
}
}
// numStack.push(ch-48);
}
index++;
if(index >= express.length()){
break;
}
}
//扫描完之后,将数栈的值,与操作符中的值进行计算
while (true){
if(operStack.isEmpty()){
break;
}
num1 = numStack.pop();
num2 = numStack.pop();
oper = operStack.pop();
res = operStack.cal(num1,num2,oper);
numStack.push(res);
}
System.out.println("表达式:"+express+"="+numStack.pop());
}
}
class ArrayStack {
private int MaxSize;// 定义数组的最大长度
private int[] arr;// 定义数组,数据就放在该数组
private int top = -1;// 定义栈顶,初始化数据为-1
public ArrayStack(int maxSize) {
this.MaxSize = maxSize;
arr = new int[MaxSize];
}
// 判断数组是否为空
public boolean isEmpty() {
return top == -1;
}
// 判断数组是否满了
public boolean isFull() {
//System.out.println("栈顶:" + top + "最大长度:" + MaxSize);
return top == MaxSize - 1;
}
//取出棧頂元素
public int peek(){
return arr[top];
}
// 进栈
public void push(int val) {
// 先判断栈是否满了,满了就不能添加进去
if (isFull()) {
System.out.println("栈已经满了~~");
return;
}
top++;
arr[top] = val;
}
// 出栈
public int pop() {
// 先判断栈是否为空
if (isEmpty()) {
throw new RuntimeException("栈为空,无法出栈!");
}
int val = arr[top];
top--;
return val;
}
public void show() {
if (isEmpty()) {
System.out.println("没有数据");
return;
}
for (int i = top; i >= 0; i--) {
System.out.print(arr[i] + "\t");
}
System.out.println();
}
/**
* 判断是否是一个操作符
* @param oper 传入的字符
* @return 如是操作符返回true,否则返回false
*/
public boolean isOper(char oper){
return oper == '+' || oper == '-' || oper =='*' || oper == '/';
}
/**
* 判断操作符的优先级
* @param oper 传入的优先级
* @return 返回优先级 分别是1,-1,0
*/
public int priority(int oper ){
if(oper == '*' || oper == '/'){
return 1;
} else if(oper == '+' || oper == '-'){
return 0;
}else {
return -1;
}
}
//计算方法
public int cal(int num1,int num2,int oper){
int res = 0;
switch (oper){
case '+': res = num1 + num2;
break;
case '-': res = num2 - num1;
break;
case '*': res = num1 * num2;
break;
case '/': res = num2 /num1;
}
return res;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。