java整数计算器程序_java实现整数计算器

package stack;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

import java.util.Stack;

public class PolandNotation {

public static void main(String[] args) {

// TODO Auto-generated method stub

//中缀转后缀

Scanner in =new Scanner(System.in);

System.out.println("请输入一个计算式:");

String exepression=in.next();

List ls=toInfixExpressionList(exepression);

System.out.println(ls);

List parsesiffixexpression=parseSuffixExpressionList(ls);

System.out.println("后缀表达式对应的List:"+parsesiffixexpression);

System.out.printf("运算结果%d\n",calculate(parsesiffixexpression));

}

public static List parseSuffixExpressionList(List ls){

//符号栈

Stack s1=new Stack();

//储存中间结果

List s2=new ArrayList();

//遍历

for(String item:ls) {

//如果是一个数就加入s2

if(item.matches("\\d+")) {

s2.add(item);

}else if(item.equals("(")) {

s1.push(item);

}else if(item.equals(")")){

//依次弹出

while(!s1.peek().equals("(")) {

s2.add(s1.pop());

}

s1.pop();//消掉小括号,消除小括号

}else {

//优先级的问题

//当item的优先级小于等于栈顶的优先级

//缺少一个比较优先级高低的方法

while(s1.size()!=0&&Operation.getValue(s1.peek())>=Operation.getValue(item)) {

s2.add(s1.pop());

}

//还需要将item栈中

s1.push(item);

}

}

while(s1.size()!=0) {

s2.add(s1.pop());

}

return s2;

}

//将中缀表达式转化为对应的List

public static List toInfixExpressionList(String s){

List ls=new ArrayList();

int i=0;

String str;

char c;

do {

//如果c一个非数字,就需要加入到ls中去

if((c=s.charAt(i))<48||(c=s.charAt(i))>57) {

ls.add(""+c);

i++;

}else {//如果是一个数字

str="";//先将字符串置空

while(i=48&&(c=s.charAt(i))<=57) {

str+=c;//拼接

i++;

}

ls.add(str);

}

}while(i

return ls;

}

public static int calculate(List ls) {

Stack stack=new Stack();

for(String item :ls) {

if(item.matches("\\d+")) {//多位数直接入栈

stack.push(item);

}else {

//pop出两个数组

int num2=Integer.parseInt(stack.pop());

int num1=Integer.parseInt(stack.pop());

int res=0;

if(item.equals("+")) {

res=num1+num2;

stack.push(""+res);

}

else if(item.equals("-")) {

res=num1-num2;

stack.push(""+res);

}

else if(item.equals("*")) {

res=num1*num2;

stack.push(""+res);

}

else if(item.equals("/")) {

res=num1/num2;

stack.push(""+res);

}

}

}

return Integer.parseInt(stack.peek());

}

}

//编写一个了类返回一个运算符号的优先级

class Operation{

private static int ADD=1;

private static int SUB=1;

private static int MUL=2;

private static int DIV=2;

//写一个方法,返回对应优先级的数字

public static int getValue(String oper) {

int result=0;

switch (oper) {

case "+":

result=ADD;

break;

case "-":

result=SUB;

break;

case "*":

result=MUL;

break;

case "/":

result=DIV;

break;

default:

System.out.println("不存在该运算符号");

break;

}

return result;

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值