您的位置:首页 > 编程语言 > Java开发

java实现中缀表达式转后缀表达式并且计算

2016-10-17 17:04 716 查看
自己写一个栈 用数组实现package cn.itcast.StackAndQuen;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
* Created by likailong on 2016/10/16.
* 中缀表达式到后缀表达式
*/
public class MathCaculate {
public static void main(String [] args){
Scanner san=new Scanner(System.in);//键盘读入
List<Character> list=new ArrayList<>();//将中缀表达式变成后缀表达式用数组存储
String input = san.next();//得到输入的信息
char[] shuju = input.toCharArray();//输入的所有信息放入char数组里
int priority=0;//标记符号的的优先级
MyStack<Character>mystack=new MyStack<>();//符号优先级栈
MyStack<Integer>caculatestack=new MyStack<>();//计算后缀表达式栈
for(int i=0;i<shuju.length;i++){//达到键盘输入的每个数据
if(getPriority(shuju[i])!=0){//的到每个数据的优先级
if(getPriority(shuju[i])>=priority){//如果得到的是个运算符 与栈顶优先级比较
priority=getPriority(shuju[i]);//如果大于等于栈顶优先级 入栈 反之出栈
mystack.push(shuju[i]);
}
else{
while (!mystack.isEmpty()){//出栈操作
char num=mystack.pop();
list.add(num);
System.out.print(num);
}
mystack.push(shuju[i]);
}
}else{
System.out.print(shuju[i]);//如果是数字直接输出 用数组接收
list.add(shuju[i]);
}
}
char num1=mystack.pop();//得到栈中最后一个符号 输出
System.out.print(num1);
list.add(num1);//存入数组
System.out.println();
for(int i=0;i<list.size();i++){//运算方法 把存在数组中的后缀表达式遍历
String nums=list.get(i).toString();//每个元素转换成字符串方便后面的Integer.parseInt(nums);
char num=list.get(i);
if('0'<=num&&num<='9'){//字符串比较应该这么写
int numss=Integer.parseInt(nums);//字符串转数字
caculatestack.push(numss);//入栈
}else {
int shuju1=caculatestack.pop();//出栈
int shuju2=caculatestack.pop();
char caculate=list.get(i);
int numadd=0;
if(caculate=='+'){//判断数组中的运算符 执行相关操作
numadd=shuju1+shuju2;
}else if(caculate=='-'){
numadd= shuju2-shuju1;
}else if(caculate=='*'){
numadd= shuju1*shuju2;
}else if(caculate=='/'){
numadd=shuju1/shuju2;
}
caculatestack.push(numadd);
}
}
System.out.println(caculatestack.pop());//得到栈顶元素及就是答案
}
private static int getPriority(char shuju) {//的输入的每个字符的优先级
int priority=0;
char num=shuju;
if(0<=num&&num<=9){
}else {
switch (num){
case '-':
case '+':
return priority=1;
case '/':
case '*':
return priority=2;
case '(':
case ')':
return priority=3;
default:priority=0;
}
}
return priority;
}

}

package cn.itcast.StackAndQuen;

/**
* Created by likailong on 2016/10/6.
* 自定义栈的存储结构  用数组实现比较简单
*/
public class MyStack<T> {
private T arr[];
private int top;
public MyStack(){
top=-1;
arr=(T[])new Object[10];//建立栈的大小 默认
}
public MyStack(int maxSize){//构造方法的重载 建立指定的栈的大小
top=-1;//因为栈操作在操作顶层 先进后出 指针初始为-1
arr=(T[])new Object[maxSize];
}
public void push(T value){
arr[++top]=value;
}//入栈操作  指针下移动
public T pop(){return arr[top--];//top指针上移动  及就是pop推出元素并且删除
}
public  T peek(){
return  arr[top];
}//查询某个元素
public boolean isEmpty(){
return top==-1;
}//判断栈是否为空 判断top指针是否改变就可
public boolean isFool(){
return top==arr.length-1;
}//判断栈是否满 及就是top指针是否是栈的长度-1 因为数组从0开始

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: