浏览 1954 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-04
import java.lang.*; import java.lang.String; import java.lang.Integer; public class YunSuan{ public static void main(String[] args){ Stack ops = new Stack(); //运算符栈 Stack opds = new Stack(); //操作数栈 String ex = new String (); //用于存储运算式 int zhizhen = 0; //作为ex的下标 int operator = 0; //运算符 int operated1=0,operated2=0; //操作数 Scanner cin = new Scanner(System.in); System.out.println("请输入运算式"); ex = "#"+cin.nextLine()+"#"; //将输入的运算式存入ex ops.push((int)ex.charAt(zhizhen++));ops.p++; //将'#'推入ops栈 while(true){ if(ops.isOperator((int)ex.charAt(zhizhen))||(int)ex.charAt(zhizhen)==40||(int)ex.charAt(zhizhen)==41){ //扫描的字符为运算符或'('、')'时 switch ((int)ex.charAt(zhizhen)){ case 40:ops.push(40);ops.p++;break; //字符为“(” case 41: { if((int)ops.gettop()=40){ //字符为“)” ops.pop();ops.p--; //弹出ops栈顶元素,栈指针-1 }else if((int)ops.gettop()=41){ //ops栈顶元素为“)” System.out.println("error"); //出错 }else //ops栈顶元素为运算符 { operated2 = opds.pop(); //弹出ops和opds的相应元素进行计算 operated1 = opds.pop(); operator = ops.pop(); opds.push((int)opds.twoJieGuo(operated1,operator,operated2)); opds.p--;ops.p--; } } } if(ops.youxianMa(ops.gettop())>=ops.youxianMa((int)ex.charAt(zhizhen))){ //ops栈顶元素优先级>=扫描字符的优先级 operated2 = opds.pop(); //进行运算 operated1 = opds.pop(); operator = ops.pop(); opds.push((int)opds.twoJieGuo(operated1,operator,operated2)); opds.p--;ops.p--; }else{ //ops栈顶元素优先级<=扫描字符的优先级 ops.push((int)ex.charAt(zhizhen));ops.p++; } }else{ opds.push((int)ex.charAt(zhizhen));opds.p++; //如果扫描所得字符为操作数 } ++zhizhen; if ((int)ex.charAt(zhizhen) = 35) break; } if((int)ops.gettop()!= 35){ //如果ops中还有运算符 operated2 = opds.pop(); //进行计算 operated1 = opds.pop(); operator = ops.pop(); opds.push((int)opds.twoJieGuo(operated1,operator,operated2)); opds.p--;ops.p--; }else{ int last = opds.pop(); System.out.print("你输入的表达式:"+ex+"="); System.out.println(last); //打印运算结果 } } } class Stack{ //定义栈类型 final int max = 20; //栈的最大容量 int[] stackvalue = new Integer(max); int p = -1; //栈内指针,空栈是为-1 public void push(int num){ //将num变量推入栈 if (this.p == max-1) System.out.println("栈已满"); else { this.p++; this.stackvalue[p] = num; } } public int pop(){ //弹出栈顶元素 if (this.p == -1) System.out.println("栈已空"); else { return (this.stackvalue[p]); this.p--; } } public int gettop(){ //取栈顶元素 if (this.p!=-1) return (int)this.stackvalue[this.p]; else System.out.println("栈已空"); } public boolean isOperator(int num){ //检查变量num是否为运算符 if (num == 42||num == 43||num==45||num==47) return true; else return false; } public int twoJieGuo(int a,int operator,int b){ //计算a operator b switch(operator){ case 42:return (a*b); break; case 43:return (a+b); break; case 45:return (a-b); break; case 47:return (a/b); break; } return 0; } public int youxianMa(int operator){ //将运算符转换成优先码,用于比较优先级。 switch(operator){ case 42:return 2; break; case 47:return 2; break; case 43:return 1; break; case 45:return 1; break; } return 0; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |