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;
}
}
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开始 }
相关文章推荐
- java实现中缀表达式转后缀表达式并且计算
- java实现中缀表达式转后缀表达式并且计算
- java实现中缀表达式转后缀表达式并且计算
- java实现中缀表达式转后缀表达式并且计算
- Java实现中缀表达式转后缀表达式并计算结果
- Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现
- 中缀表达式转换为前缀及后缀表达式并求值(java实现)
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- 【java】中缀表达式转后缀表达式 java实现
- java 实现中缀表达式转为后缀表达式
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- Java 栈实现中缀表达式转后缀表达式
- java中的栈Stack的基本使用和应用(二) ——利用栈计算合法的算术表达,中缀表达式转后缀表达式
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)
- C语言实现括号匹配,中缀表达式转后缀表达式并计算具体代码实现
- Java 中缀表达式转后缀表达式 + 中/后缀表达式计算
- 数据结构—中缀表达式转后缀表达式算法及实现—栈的应用—计算表达式(C++代码实现)(1)
- 使用堆栈计算后缀表达式--java实现
- 【java】中缀表达式转后缀表达式 java实现
- Java实现表达式计算(中缀表达式转化为后缀表达式/逆波兰式)