最近在学习JAVA,来更一下最近练习的一下小题目
使用栈来进行中缀表达式和后缀表达式的转换,并对输出的后缀表达式进行计算求值
package baoxinhai_test;
import java.util.*;
public class Exp {
private char[] inputlist; //输入的中缀表达式
private char[] signlist; //符号列表
private char[] resultlist; //转换的逆波兰表达式
private int signlisttop,resultlisttop; //栈指针
public Exp() {
signlisttop=0;
resultlisttop=0;
}
public void inputString() { //输入中缀表达式
Scanner scan=new Scanner(System.in);
System.out.println("请输入需要转换的中缀表达式 :");
String s=scan.nextLine();
s.replaceAll(" ", "");
inputlist=s.toCharArray(); //将输入的中缀表达式转换为字符串数组
System.out.println("您输入的中缀表达式为:");
for(int i=0;i<inputlist.length;i++)
{
System.out.print(inputlist[i]+"");
}
scan.close();
System.out.println();
}
public void Convert() { //将输入的中缀表达式转换为后缀表达式
signlist=new char[inputlist.length];
resultlist=new char[inputlist.length];
for(int i=0;i<inputlist.length;i++)
{
switch (inputlist[i]) {
case '(':
signlisttop++;
signlist[signlisttop]=inputlist[i];
break;
case ')':
while(signlist[signlisttop]!='(') {
resultlist[resultlisttop]=signlist[signlisttop];
resultlisttop++;
signlisttop--;
}
signlisttop--;
break;
case '+':
case '-':
for(int j=signlisttop;j>=0;j--)
{
if(signlist[signlisttop]=='('||signlisttop==0)
{
break;
}
else {
resultlist[resultlisttop]=signlist[signlisttop];
resultlisttop++;
signlisttop--;
}
}
signlisttop++;
signlist[signlisttop]=inputlist[i]; //压入符号栈
break;
case '*':
case '/':
if(signlist[signlisttop]=='+'||signlist[signlisttop]=='-'||signlist[signlisttop]=='('||signlisttop==0)
{
signlisttop++;
signlist[signlisttop]=inputlist[i];
break;
}
else
{
resultlist[resultlisttop]=signlist[signlisttop];
resultlisttop++;
signlist[signlisttop]=inputlist[i];
break;
}
default:
resultlist[resultlisttop]=inputlist[i];
resultlisttop++;
break;
}
}
while(signlisttop>0)
{
resultlist[resultlisttop]=signlist[signlisttop];
signlisttop--;
resultlisttop++;
}
}
public void OutputList() { //将后缀表达式输出
System.out.println("输出后缀表达式为:");
for(int i=0;i<resultlist.length;i++)
{
if(resultlist[i]=='\0') //到字符串尾部时,结束输出
{
break;
}
System.out.print(resultlist[i]); //print(char)即可
}
System.out.println();
}
public void CountString() {
int valuetop=0;
float[] flo=new float[resultlist.length];
for(int i=0;i<resultlist.length;i++)
{
if(resultlist[i]>=48&&resultlist[i]<58)
{
flo[valuetop]=resultlist[i]-'0';
valuetop++;
}
if(resultlist[i]==43)
{
float tem=flo[valuetop-2]+flo[valuetop-1];
valuetop--;
flo[valuetop-1]=tem;
}
if(resultlist[i]==45)
{
float tem=flo[valuetop-2]-flo[valuetop-1];
valuetop--;
flo[valuetop-1]=tem;
}
if(resultlist[i]==42)
{
float tem=flo[valuetop-2]*flo[valuetop-1];
valuetop--;
flo[valuetop-1]=tem;
}
if(resultlist[i]==47)
{
float tem=flo[valuetop-2]/flo[valuetop-1];
valuetop--;
flo[valuetop-1]=tem;
}
}
System.out.println("所输出的后缀表达式的值为:" + flo[valuetop-1]);
}
public static void main(String[] args) {
Exp exp=new Exp();
exp.inputString();
exp.Convert();
exp.OutputList();
exp.CountString();
}
}