首页 > 代码库 > 计算器 栈 带括号 2016 10 21

计算器 栈 带括号 2016 10 21

#include<iostream>
#include<stack>
#include<string>
#include<cmath>
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;
}

 

 

 

void run(){
 string s;
 getline(cin,s,‘\n‘);
 stack<int> OPND;
 stack<char> OPTR;
    OPTR.push(‘#‘);

    while(s!=""){
     cout<<s<<endl;
     cout<<s[0]<<endl;
     if(s[0]<‘0‘||s[0]>‘9‘){
        char ts = GetOpra(s);
        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();
             cout<<"a=="<<a<<"  "<<"b=="<<b<<endl;
             OPND.pop();
             if(OPTR.top()==‘*‘)  OPND.push(a*b);
             if(OPTR.top()==‘/‘)  OPND.push(b/a);
             if(OPTR.top()==‘+‘)  OPND.push(a+b);
             if(OPTR.top()==‘-‘)  OPND.push(b-a);
             cout<<"OPND.top()=="<<OPND.top()<<endl;
             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();
                ts = ‘ ‘;
                cout<<"OPtR.top()=="<<OPTR.top()<<endl;
     }
       if(Level(ts,OPTR.top())==0) {
        
           cout<<"zhangding="<<OPTR.top()<<endl;
           OPTR.pop();
           break;
   }  
  }
  
     else{
     
     int a = GetNum(s);
       OPND.push(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();
         if(OPTR.top()==‘*‘)  OPND.push(a*b);
         if(OPTR.top()==‘/‘)  OPND.push(b/a);
         if(OPTR.top()==‘+‘)  OPND.push(a+b);
         if(OPTR.top()==‘-‘)  OPND.push(b-a);
         OPTR.pop();
  }
  
  cout<<"OPND.top()="<<OPND.top()<<endl;

}

int main(){
 run();
 return 0;
}

计算器 栈 带括号 2016 10 21