码迷,mamicode.com
首页 > 其他好文 > 详细

改进了的栈计算器

时间:2016-10-26 07:02:59      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:cout   小数   情况   line   iostream   name   sum   输入   字符   

#include<iostream>
#include<stack>
#include<string>
#include<cmath>
#include<iomanip>
using namespace std;

int GetNum(string s){ 
 string ss;
 ss = s;
 int len = ss.length();
 int sum = 0;
 int count=0; 
 for(int i=0;i<len;i++){
  if(ss[i]>=‘0‘&& ss[i]<=‘9‘){
              sum = (ss[i]-‘0‘)+ sum*10;
                count++;
  }
  else if(count!=0) break;  
 }
 return sum;
}

string CutNum(string s){
 string ss,s1;
 ss = s;
 s1 = "";
    int t;
 int len = ss.length();
    for(int i=0;i<len;i++){
     if(ss[i]<‘0‘||ss[i]>‘9‘){
        t=i;
     break; 
  }
 }
 
 if(t==0) return s1;
 
 for(int j=t;j<len;j++){
  s1+=ss[j];
 }
 
 return s1; 
}

string CutOpra(string s){
 string ss,s1;
 ss = s;
 s1="";
    int t=0;
 int len = ss.length();
 
 if(len==1) return s1;
 
    for(int i=0;i<len;i++){
     if(ss[i]<‘0‘|| ss[i]>‘9‘){
        t=i;
     break; 
  }
 }
 
 for(int j=t+1;j<len;j++){
  s1+=ss[j];
 }
 
 return s1; 
}

char GetOpra(string s){
 string ss,s1;
 ss = s;
    int t;
 int len = ss.length();
    for(int i=0;i<len;i++){
     if(ss[i]<‘0‘||ss[i]>‘9‘){
        t=i;
     break; 
  }
 }
 char ts;
 ts = ss[t];
 return  ts;
}

 

//a 栈顶元素
int Level(char a,char b){         // 优先级比较   大于return1   等于return0   小于return-1
 
 if(a==‘+‘&&(b==‘*‘||b==‘/‘||b==‘(‘))                                                 return 1;
 else if(a==‘+‘&&(b==‘+‘||b==‘-‘||b==‘#‘||b==‘)‘))                                    return -1;
 
 else if(a==‘-‘&&(b==‘*‘||b==‘/‘||b==‘(‘))                                            return 1;
 else if(a==‘-‘&&(b==‘+‘||b==‘-‘||b==‘#‘||b==‘)‘))                                    return -1;
 
 else if(a==‘*‘&& b==‘(‘)                                                             return 1;
 else if(a==‘*‘&&(b==‘*‘||b==‘/‘||b==‘+‘||b==‘-‘||b==‘#‘||b==‘)‘))                    return -1;
 
 else if(a==‘/‘&&(b==‘(‘))                                                            return 1;
 else if(a==‘/‘&&(b==‘*‘||b==‘/‘||b==‘+‘||b==‘-‘||b==‘#‘||b==‘)‘))                    return -1;
 

 else if(a==‘(‘&&(b==‘+‘||b==‘-‘||b==‘*‘||b==‘/‘||b==‘(‘))                            return 1;
 else if(a==‘(‘&& b==‘)‘)                                                             return 2;
 
 else if(a==‘)‘&&(b==‘+‘||b==‘-‘||b==‘*‘||b==‘/‘||b==‘)‘||b==‘#‘))                    return 1;

    else if(a==‘#‘&&(b==‘+‘||b==‘-‘||b==‘*‘||b==‘/‘||b==‘(‘))                            return 1;
    else if(a==‘#‘&&b==‘#‘)                                                              return 0;
 
 else return 100000;
}


int Judge(string s){
 
 if(s[0]==‘-‘) {
    cout<<"由于式子以负号开头,为了方便计算器的运算,所以在整个式子前加一个0"<<endl;
    s=‘0‘+s; 
 }
 int len = s.length();
 int c=0;
 for(int i=0;i<len;i++){
  if(s[i]==‘(‘) c++;
  if(s[i]==‘)‘) c--;
  
  if(s[i]==‘.‘){
   cout<<"本计算器不支持小数点的操作"<<endl;
   return 1;
  }
  
  if(!((s[i]>=‘0‘&&s[i]<=‘9‘)||s[i]==‘+‘||s[i]==‘-‘||s[i]==‘*‘||s[i]==‘/‘||s[i]==‘#‘||s[i]==‘(‘||s[i]==‘)‘)){
   cout<<"对不起,您部分输入字符不符合要求"<<endl;
   return 2;
  }
  if(s[i]==‘0‘&&s[i-1]==‘/‘){
   cout<<"被除数为0,操作出现错误"<<endl;
   return 0;
  }
  
  
  
 }
 if(c!=0) {
  cout<<"您输入的式子括号不匹配"<<endl;
  return 3;
 }
 
 return -1;
}

 


void run(){
 string s;
 getline(cin,s,‘\n‘);
 
 while(Judge(s)==1||Judge(s)==2||Judge(s)==3||Judge(s)==0){
  cout<<"请重新输入:";
  getline(cin,s,‘\n‘);
 }
 
 
 
 stack<int> OPND;
 stack<char> OPTR;
 char op[1000];
 int  num[1000];
    OPTR.push(‘#‘);
    int optop=0;
    int numtop=0;
    int step = 0;
    bool fac = false;
   
    cout<<"-------------------------------------------------------------------------------------------------------------------"<<endl;
    cout<<"步骤         OPTR栈        OPND栈                             输入字符                          主要操作           "<<endl;
    cout<<"-------------------------------------------------------------------------------------------------------------------"<<endl;
     
    string mainoprt = "";
    op[optop++]=‘#‘;
    while(s!=""){
        int e=0;
        int flag=0;
     cout<<left<<setw(13)<< ++step;
     for(int i=0;i<optop;i++){
      cout<<op[i];
  }
     cout<<left<<setw(15-optop)<<" ";
     for(int i=0;i<numtop;i++){
      
      cout<<num[i]<<"‘";
           
            int t = num[i];
            if(t<0){
             t = -1*t;
             flag++;
   }
            while(t>10){
             flag++;
             t=t/10;  
   }
 
  }
     cout<<setw(20-2*numtop-flag)<<" ";
     cout<<right<<setw(23)<<s<<endl;
                    
     
     
     
     
     if(s[0]<‘0‘||s[0]>‘9‘){
        char ts = GetOpra(s);
        op[optop++] = ts;
    //    cout<<"ts="<<ts<<endl;
        s=CutOpra(s);
    //    cout<<"CutOpra(s)=="<<s<<endl;
    //        cout<<"OPTR.top()="<<OPTR.top()<<endl;
     while(Level(OPTR.top(),ts)==-1) {
             int a,b;
             a = OPND.top();
             OPND.pop();
             b =  OPND.top();
             numtop  = numtop-2;
           
   //          cout<<"a=="<<a<<"  "<<"b=="<<b<<endl;
             OPND.pop();
             if(OPTR.top()==‘*‘)  OPND.push(a*b);
             if(OPTR.top()==‘/‘)  {
              if(a==0) cout<<"    程序出现被除数为0的情况,被除数将被随机数取代,此次运算无效"<<endl;
              fac = true;
     a = 1;
              OPND.push(b/a);
    }
             if(OPTR.top()==‘+‘)  OPND.push(a+b);
             if(OPTR.top()==‘-‘)  OPND.push(b-a);
   //          cout<<"OPND.top()=="<<OPND.top()<<endl;
                optop--;
                op[optop-1] = ts;
                num[numtop++] = OPND.top();
             OPTR.pop();
 //      cout<<"OPtR.top()=="<<OPTR.top()<<endl;
          
       }
      while(Level(OPTR.top(),ts)==1) {
             OPTR.push(ts);  
             break;
     }
           if(Level(OPTR.top(),ts)==2){
                OPTR.pop();
                optop = optop-2;
                ts = ‘ ‘;
      //          cout<<"OPtR.top()=="<<OPTR.top()<<endl;
     }
       if(Level(ts,OPTR.top())==0) {
        
  //         cout<<"zhangding="<<OPTR.top()<<endl;
           OPTR.pop();
           optop = optop-1;
           break;
   }  
  }
  
     else{
     
     int a = GetNum(s);
       OPND.push(a);
       mainoprt +="PUSH(OPND, ‘‘)";
       num[numtop++] = a;
       s=CutNum(s);
  }
 }
 
 
 
 
    while(!OPTR.empty()){
       
        // cout<<"zhangding="<<OPTR.top()<<endl;
         OPTR.pop();
     
     int a,b;
        // a = OPND.top();     cout<<"a="<<a<<endl;
         OPND.pop();
        //b =  OPND.top();    cout<<"b="<<b<<endl;
         OPND.pop();
         numtop  = numtop-2;
         if(OPTR.top()==‘*‘)  OPND.push(a*b);
         if(OPTR.top()==‘/‘)  {
              if(a==0) cout<<"    程序出现被除数为0的情况,被除数将被随机数取代,此次运算无效"<<endl;
              fac = true;
     a = 1;
              OPND.push(b/a);
    }
         if(OPTR.top()==‘+‘)  OPND.push(a+b);
         if(OPTR.top()==‘-‘)  OPND.push(b-a);
         optop--;
            num[numtop++] = OPND.top();
         OPTR.pop();
    
         
     int e=0;
        int flag=0;
     cout<<left<<setw(13)<< ++step;
     for(int i=0;i<optop;i++){
      cout<<op[i];
  }
     cout<<left<<setw(15-optop)<<" ";
     for(int i=0;i<=numtop;i++){
      
      cout<<num[i]<<"‘";
           
            int t = num[i];
            if(t<0){
             t = -1*t;
             flag++;
   }
            while(t>10){
             flag++;
             t=t/10;  
   }
 
  }
     cout<<setw(26-2*numtop-flag)<<" ";
     cout<<right<<setw(23)<<s<<endl;
   
         
  }
  
  cout<<left<<setw(13)<<step+1<<left<<setw(15-optop)<<"#"<<left<<setw(15-optop)<<OPND.top()<<right<<setw(26)<<"#"<<endl;
  cout<<endl;
  if(fac == false)cout<<"这个式子的结果="<<OPND.top()<<endl;
  else cout<<"这个式子的结果不存在"<<endl;

}

int main(){
 while(1){
     run();
 }

 return 0;
}

改进了的栈计算器

标签:cout   小数   情况   line   iostream   name   sum   输入   字符   

原文地址:http://www.cnblogs.com/sysu-eeman-yang/p/5998890.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!