`
llawliet123
  • 浏览: 891 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

这是我变得一个利用栈实现算术四则运算,较简单,但是编译错误,求指教

阅读更多
import java.util.Scanner;
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;
}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics