利用栈使用简易计算器(Java实现)

网友投稿 261 2022-12-26


利用栈使用简易计算器(Java实现)

题目:使用栈计算类似表达式: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);//创建一个http://数栈

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.pushhttp://(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;

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:账户系统接口设计(账户体系设计)
下一篇:Java线程池的拒绝策略实现详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~