棧:先進後出
中綴表達式:A+B*C
後綴表達式:ABC*+
1.中綴表達式轉後綴表達式
StackX.java(構造一個棧)
package JavaAppInFix;
/**
* 構造一個棧
* @author qingshuang
*
*/
public class StackX {
private char[] stackArray;
private int maxSize;
private int top;
public StackX(int s){
maxSize=s;
stackArray=new char[maxSize];
top=-1;
}
//添加數據
public void push(char j){
stackArray[++top]=j;
}
//查看並刪除數據
public char pop(){
return stackArray[top--];
}
//查看數據
public char peek(){
return stackArray[top];
}
public boolean isEmpty(){
return top==-1;
}
public int size(){
return top+1;
}
public char peekN(int n){
return stackArray[n];
}
public void dispalyStack(String s){
System.out.print(s);
System.out.print("Stack (bottom-->top):");
for(int j=0;j<size();j++){
System.out.print(peekN(j)+" ");
}
System.out.println();
}
}
InToPost.java(中綴表達式轉成後綴表達式)
package JavaAppInFix;
/**
* 中綴表達式轉成後綴表達式
*
* @author qingshuang
*
*/
public class InToPost {
private StackX theStack;
private String input;// 中綴表達式
private String output="";// 後綴表達式
public InToPost(String in) {
input = in;
int stackSize = input.length();
theStack = new StackX(stackSize);
}
//4+3*(6-2)
public String doTrans() {
for (int j = 0; j < input.length(); j++) {
char ch = input.charAt(j);
theStack.dispalyStack("For " + ch + " ");
switch (ch) {
case '+':
case '-':
gotOper(ch, 1);
break;
case '*':
case '/':
gotOper(ch, 2);
break;
case '(':
theStack.push(ch);
break;
case ')':
gotParen(ch);
break;
default:
output = output + ch;
break;
}
}// for循環結束
while (!theStack.isEmpty()) {
theStack.dispalyStack("while");
output = output + theStack.pop();
}
theStack.dispalyStack("End");
return output;
}
public void gotOper(char opThis, int perc1) {
while(!theStack.isEmpty()){
char opTop=theStack.pop();
if(opTop=='('){
theStack.push(opTop);
break;
}else{
int prec2;
if(opTop=='+'||opTop=='-')prec2=1;
else prec2=2;
if(prec2<perc1){
theStack.push(opTop);
break;
}else{output=output+opTop;}
}
}
theStack.push(opThis);
}
public void gotParen(char ch) {
while(!theStack.isEmpty()){
char chx=theStack.pop();
if(chx=='('){
break;
}else{
output=output+chx;
}
}
}
}
InfixApp.java(中綴表達式轉後綴表達式測試)
package JavaAppInFix;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class InfixApp {
/**中綴表達式轉後綴表達式測試
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
String input,output;
while(true){
System.out.print("Enter infix:");
System.out.flush();
input=getString();
if(input.equals(""))break;
InToPost theTrans=new InToPost(input);
output=theTrans.doTrans();
System.out.println("Postfix is "+output+"\n");
}
}
public static String getString() throws IOException{
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
String s=br.readLine();
return s;
}
}
2.中綴表達式轉後綴表達式後可運算
StackY.java(構造一個棧)
package JavaAppInFix;
/**
* 中綴表達式轉後綴表達式後可運算
* @author qingshuang
*
*/
public class StackY {
private int[] stackArray;
private int maxSize;
private int top;
public StackY(int s){
maxSize=s;
stackArray=new int[maxSize];
top=-1;
}
//添加數據
public void push(int j){
stackArray[++top]=j;
}
//查看並刪除數據
public int pop(){
return stackArray[top--];
}
//查看數據
public int peek(){
return stackArray[top];
}
public boolean isEmpty(){
return top==-1;
}
public boolean isFull(){
return top==maxSize-1;
}
public int size(){
return top+1;
}
public int peekN(int n){
return stackArray[n];
}
public void dispalyStack(String s){
System.out.print(s);
System.out.print("Stack (bottom-->top):");
for(int j=0;j<size();j++){
System.out.print(peekN(j)+" ");
}
System.out.println();
}
}
ParsePost.java(運算後的後綴表達式)
package JavaAppInFix;
/**
* 運算後綴表達式
* @author qingshuang
*
*/
public class ParsePost {
private StackY theStack;
private String input;
public ParsePost(String s){
input=s;
}
public int doParse(){
theStack=new StackY(20);
char ch;
int j;
int num1,num2,interAns;//num1,num2取出來的兩操作數,interAns這兩數的運算結果
for(j=0;j<input.length();j++){
ch=input.charAt(j);
theStack.dispalyStack(" "+ch+" ");
if(ch>='0'&&ch<='9'){
theStack.push((int)(ch-'0'));
}else{
num2=theStack.pop();
num1=theStack.pop();
switch(ch){
case'+':
interAns=num1+num2;
break;
case'-':
interAns=num1-num2;
break;
case'*':
interAns=num1*num2;
break;
case'/':
interAns=num1/num2;
break;
default:
interAns=0;
}
theStack.push(interAns);
}
}
interAns=theStack.pop();
return interAns;
}
}
PostfixApp.java(運算後綴表達式測試類)
package JavaAppInFix;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 運算後綴表達式
* @author qingshuang
*
*/
public class PostfixApp {
public static void main(String[] args) throws IOException {
String input;
int output;
InToPost inobj;
while(true){
System.out.print("Enter infix:");
System.out.flush();
input=getString();
if(input.equals(""))break;
inobj=new InToPost(input);
input=inobj.doTrans();//中綴表達式變後綴表達式
System.out.println("後綴表達式 to "+input);
ParsePost theTrans=new ParsePost(input);
output=theTrans.doParse();
System.out.println("Evaluates to "+output);
}
}
public static String getString() throws IOException{
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
String s=br.readLine();
return s;
}
}