整数四则运算的java实现-栈和队列的使用练习

数据结构大作业做简易解释器,要使用四则运算,先写到main里面试验一下,在做成单独的函数以备调用


import java.util.LinkedList;

import java.util.Queue;
import java.util.Stack;




public class calTest {

/**
* @param args
*/

public static void main(String[] args) {
// TODO Auto-generated method stub
String s="2*7-9+6/8*9-93*5=";
Stack<String> num=new Stack<String>();//放变量的栈
Stack<Character> sym =new Stack<Character>();//放运算符的栈


//nums数组存放所有需要计算的数字或变量
String[] nums = s.split("[+*-/=]");
//把要计算的数字存放到队列中
Queue<String> queue = new LinkedList<String>();
for(int i=0;i<nums.length;i++){
queue.offer(nums[i]);
}
//syms存放所有运算符
String syms="";
for(int i=0;i<s.length();i++){
  if(s.charAt(i)=='+'|s.charAt(i)=='-'|s.charAt(i)=='*'|s.charAt(i)=='/'|s.charAt(i)=='='){
  syms+=s.charAt(i);
  }
}
//把与运算符存放到队列里
Queue<Character> queue2 = new LinkedList<Character>();
for(int i=0;i<syms.length();i++){
queue2.offer(syms.charAt(i));
}



//开始计算
//当符号队列不空的时候
while(!queue2.isEmpty()){

int num1=0;
int num2=0;
if(sym.isEmpty()){
if(num.isEmpty()){
num.push(queue.poll());
}
sym.push(queue2.poll());
num.push(queue.poll());
}else{

char SymPeek=sym.peek();
char Q2Peek=queue2.peek();


switch(SymPeek){
case('+'):{
if(Q2Peek=='+'|Q2Peek=='-'|Q2Peek=='='){
sym.pop();
int result=0;
num1=Integer.parseInt(num.pop());
num2=Integer.parseInt(num.pop());
result=num1+num2;
num.push(result+"");

}else{
num.push(queue.poll());
sym.push(queue2.poll());
}
break;
}
case('-'):{
if(Q2Peek=='+'|Q2Peek=='-'|Q2Peek=='='){
sym.pop();
int result=0;
num1=Integer.parseInt(num.pop());
num2=Integer.parseInt(num.pop());
result=num2-num1;
num.push(result+"");

}else{
num.push(queue.poll());
sym.push(queue2.poll());
}
break;
}
case('*'):{
sym.pop();
int result=0;
num1=Integer.parseInt(num.pop());
num2=Integer.parseInt(num.pop());
result=num1*num2;
num.push(result+"");

break;
}
case('/'):{
sym.pop();
int result=0;
num1=Integer.parseInt(num.pop());
num2=Integer.parseInt(num.pop());
result=num2/num1;
num.push(result+"");
break;
}
}
}
}
while(!num.isEmpty()){
System.out.println("结果是:"+num.pop());
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值