后缀表达式为二叉树中的后序遍历后写出的表达式
以例题为例子,
12 4 + 13 - 6 2 * +=
易知正常顺序为
((12+4)-13)+(6*2)
使用栈来解这个问题
//定义栈的接口
public interface IStack<E> {
E push(E item); //入栈
E pop(); //出栈
E peek(); //取栈顶元素
int size(); //返回栈中元素的个数
boolean empty(); //判断栈是否为空
}
//实现栈的接口
import java.lang.reflect.Array;
public class SeqStack<E> implements IStack<E> {
private int maxsize;
private int top;
private E[] data;
public SeqStack(Class <E> type,int maxsize){
this.maxsize=maxsize;
top=-1; //栈为空top为-1
data = (E[])Array.newInstance(type, maxsize);
}
//入栈
public E push(E item) {
if(!isfull()){
data[++top]=item;
return item;
}
else
return null;
}
//
public E pop() {
if(!empty())
return data[top--];
else
return null;
}
public E peek() {
if(!empty()){
return data[top];
}
else
return null;
}
public int size() {
return top+1;
}
public boolean empty() {
if(top==-1)
return true;
else
return false;
}
public boolean isfull(){
if(top==maxsize-1)
return true;
else
return false;
}
}
public class test {
public static void main(String[] args) {
char [] data={12,4,'+',13,'-',6,2,'*','+'};
SeqStack<Character> ss=new SeqStack<Character>(Character.class,data.length);
for(int i=data.length-1;i>=0;i--){//循环将data的数据放入栈内
ss.push(data[i]);
}
//创建一个栈顺序表,用于暂时存放从ss取出来的数据
SeqStack<Character> ss0=new SeqStack<Character>(Character.class,data.length);
int result=0;
while(!ss.empty()){
char temp=ss.pop();
ss0.push(temp);
//当栈弹出的字符为运算符,则开始运算
if(temp=='+'||temp=='-'||temp=='*'||temp=='/'){
result =eachOtherAdd(ss0);//调用运算方法
while(!ss0.empty()){//将运算结果和原来弹出多余的数据压回原来的栈顺序表
char temp0=ss0.pop();
ss.push(temp0);
}
}
}
System.out.println(result);
}
//调用所弹出的运算符和最后弹出是数据,运算出结果
public static int eachOtherAdd(SeqStack<Character> ss0){
//创建三个char类型来存储将要计算的数据
char c3=ss0.pop();
int i2=ss0.pop();//将char类型转换为int类型
int i1=ss0.pop();
int add=0;//创建一个运算后的结果
switch(c3){//判断运算符
case '+':
add=i1+i2;
break;
case '-':
add=i1-i2;
break;
case '*':
add=i1*i2;
break;
case '/':
add=i1/i2;
break;
}
ss0.push((char)add);
return add;
}
}