📄 posexpression.java
字号:
//后序表达式的计算处理过程和前序表示相同,唯一不同的是读取表达式的方向和前序表达式相反。而是从左向右读取。
//操作方法:1、建立操作数的堆栈。初始为空。
// 2、当 表达式尚未读取完时,(由左向右)一个运算单元。
// 当读取的是操作数,则将其存入操作数堆栈。
// 当读取的是运算符,则从操作数堆栈中读取出所需要的操作数进行计算,并将计算结果存回堆栈
// 3、当表达式读取完成后,则操作数堆栈的内容即为表达式的计算结果。
// source code
//输入一个表达式,并计算其值。
import java.util.*;
import java.io.*;
public class posexpression{
public static void main(String args[])throws Exception{
StackArray Operand=new StackArray();
String Expression=new String(); //声明表达式字符串
int Position=0; //表达式位置
int Operand1=0; //前操作数
int Operand2=0; //后操作数
int Evaluate=0; //
System.out.println("Please imput the postorder expression: ");
InputStreamReader ir;
BufferedReader in;
ir=new InputStreamReader(System.in);
in=new BufferedReader(ir);
Expression=in.readLine();
while(true)
{
if(Operand.IsOperator(Expression.charAt(Position)))
{
Operand1=Operand.Pop();
Operand2=Operand.Pop();
//计算后两个操作数存入堆栈;
Operand.Push(Operand.TwoResult(Expression.charAt(Position),Operand1,Operand2));
}
else
//存入操作数堆栈--需要左ASII码转换
Operand.Push(Expression.charAt(Position)-48);
Position++;
if(Position>=Expression.length())
break;
}
//取出最终表达式
Evaluate=Operand.Pop();
System.out.print("The expression [ "+Expression+"]");
System.out.print(" result is "+Evaluate);
}
}
class StackArray
{
int MaxSize=20;
int [] Astack = new int[MaxSize];
int Top=-1;
//------------------------------------------------------
//存入堆栈数据
//-------------------------------------------------------
public void Push(int value)
{
int i;
if(Top>=MaxSize) //判断是否已经熬出堆栈最大容量
System.out.print("The stack is full");
else
{
Top++;
Astack[Top]=value;
}
}
//------------------------------------------------------
//从堆栈中取出数据
//-------------------------------------------------------
public int Pop()
{
int Temp; //暂存从堆栈取出来的数据
int i; //循环计数变量
if(Top<0)
{
System.out.println("The stack is Empty!");
return -1;
}
Temp=Astack[Top];
Top--;
return Temp;
}
//------------------------------------------------------
//判断是否是运算符号
//-------------------------------------------------------
public boolean IsOperator(int Operator)
{
if(Operator==43||Operator==45||Operator==42||Operator==47)
return true; //+ - * /
else
return false;
}
//------------------------------------------------------
//判断运算符的优先权
//-------------------------------------------------------
public int Priority (int operator)
{
if(operator==43||operator==45)
return 1; //+ -
else if(operator==42||operator==47)
return 2; //* /
else
return 0;
}
//------------------------------------------------------
//对任意两个操作数进行运算并求值
//-------------------------------------------------------
public int TwoResult(int operator, int operand1,int operand2)
{
switch(operator)
{
case 43:
return (operand1+operand2);
case 45:
return (operand1-operand2);
case 42:
return (operand1*operand2);
case 47:
return (operand1/operand2);
}
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -