数据结构 运算表达式
java吧
全部回复
仅看楼主
level 1
Sibeya_king 楼主
import java.io.*;import java.math.BigDecimal;import java.util.*;class StackX{ private int maxSize; private char[] stackArray; private int top; public StackX(int size) // 构造栈 { maxSize = size; 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) // 返回栈内第n个元素 { return stackArray[n]; } public void displayStack(String s) // 输出栈内元素 { System.out.print(s); }} class InToPost // 中缀转后缀{ private StackX theStack; // 声明栈theStack private String input; private String output = ""; char[] var = null; public InToPost(String in) { input = in; int stackSize = input.length(); //用输入的运算式字符串长度设定栈的长度 theStack = new StackX(stackSize);//定义栈 } public String doTrans() // 转换操作 { for(int j=0; j< input.length(); j++) // 转换次数循环 { char ch = input.charAt(j); //返回第j个字符 switch(ch) { case '+': // +或-运算符 case '-': gotOper(ch, 1); // go pop operators break; // 优先级为1 case '*': // *或/运算符 case '/': gotOper(ch, 2); // go pop operators break; // 优先级为2 case '^': gotOper(ch, 3); // go pop operators break; // 优先级为3 case '(': // 左括号 theStack.push(ch); // 压入栈 break; case ')': // 右括号 gotParen(ch); // 寻找对应的左括号 break; default: // 操作数 output = output + ch; // 写入输出字符串 /* for(int n = 0; n < output.length(); n++) { if((ch >= 'a') || (ch <= 'z')) var[n] = ch; System.out.print(var[n] + "="); }*/ break; } } while( !theStack.isEmpty() ) // 栈非空 { theStack.displayStack(""); // *diagnostic* output = output + theStack.pop(); // write to output } theStack.displayStack(""); // *diagnostic* 
2008年06月18日 12点06分 1
level 1
Sibeya_king 楼主
return output; // 返回后缀式 } public void gotOper(char opThis, int prec1) // 从输入字符串获取运算符 { while( !theStack.isEmpty()) //栈非空 { char opTop = theStack.pop(); // 栈内弹出栈顶元素 if( opTop == '(' ) // 如果栈顶为左括号 { theStack.push(opTop); // 压入栈顶元素 break; } else // 如果栈顶为运算符 { int prec2; // 栈顶运算符优先级 if(opTop=='+' || opTop=='-') prec2 = 1; else if(opTop=='*' || opTop=='/') prec2 = 2; else prec2 = 3; if(prec2 < prec1) // 栈顶运算符的优先级小于读入运算符的优先级 { 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; // 输出 } }}class InTransPost{ public static void main(String[] args) throws IOException { String input, output; while(true) { input = getString(); // input接收键盘输入的表达式 if( input.equals("") ) // 输入enter则退出 break; // make a translator InToPost theTrans = new InToPost(input); output = theTrans.doTrans(); // 转换 System.out.println(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; }}
2008年06月18日 12点06分 2
level 1
Sibeya_king 楼主
补充说明:这个程序只能把带括号的标准表达式转为后缀表达式,却连算数都不能……急需高手帮忙添加点代码完善一下算数。如果有可能的话可以帮忙建立数组,统计表达式中如果输入变量,即字母,例如输入(a+2)*3-b/4,能提示输出a=和b=,能够给变量赋值之后算数……挺麻烦的~拜托了
2008年06月18日 12点06分 3
1