这里面的caluse为什么没有被更新?我明明做了删除操作的呀
查看原帖
这里面的caluse为什么没有被更新?我明明做了删除操作的呀
482198
Surigae楼主2021/8/21 16:36
#include<iostream>
#include<string>
#include<stack>
#include<cmath>
#include<sstream>
#include<algorithm>
using namespace std;
string back;
string caluse="";
int transfer(char s){
    if(s=='+')return 1;
    if(s=='-')return 1;
    if(s=='*')return 2;
    if(s=='/')return 2;
    if(s=='^')return 3;
    else return -1;
}
string int_to_str(long long num){
    string yy;
    while(num>0){
        yy+=(num%10+'0');
        num/=10;
    }
    reverse(yy.begin(),yy.end());
    return yy;
}
void change(string str){
    stack<char> s;
    long long i=0;
    while(i<str.size()){
        if(str[i]=='('){
            s.push(str[i]);
            i++;
        }
        else if(str[i]==')'){
            while(!s.empty() and s.top()!='('){
                back+=s.top();
                back+=" ";
                s.pop();
            }
            s.pop();
            i++;
        }
        else if(str[i]>='0' and str[i]<='9'){
            back+=str[i];
            back+=" ";
            i++;
        }
        else{
            while(!s.empty() and transfer(s.top())>=transfer(str[i])){
                back+=s.top();
                back+=" ";
                s.pop();
            }
            s.push(str[i]);
            i++;
        }
    }
    while(!s.empty()){
        back+=s.top();
        s.pop();
    }
}
char to_str(long long num){
    return num+'0';
}
void print(long long i1,long long i2,char fuhao){
    int i=0;
    long long temp;
    string p2="";
    for(int i=0;i<caluse.size();i++){
        p2+=caluse[i];
    }
    while(i<p2.size()){
        char c=p2[i];
        if(c>='0' and c<='9'){
            int add=0,starti=i;
            int temp=p2[i]-'0';
            i++;
            add++;
            while(i<caluse.length() and caluse[i]>='0' and caluse[i]<='9'){
                temp=temp*10+(p2[i]-'0');
                i++;add++;
            }
            i++;add++;
            int temp2=p2[i]-'0';
            i++;add++;
            while(i<caluse.length() and caluse[i]>='0' and caluse[i]<='9'){
                temp2=temp2*10+(p2[i]-'0');
                i++;add++;
            }
            if(temp==i1 and temp2==i2 and p2[i+1]==fuhao){
                caluse.erase(i+1,2);
                if(fuhao=='+'){caluse.insert(i,int_to_str(i1+i2)+"");}
                if(fuhao=='-'){caluse.insert(i,int_to_str(i1-i2)+"");}
                if(fuhao=='*'){caluse.insert(i,int_to_str(i1*i2)+"");}
                if(fuhao=='/'){caluse.insert(i,int_to_str(i1/i2)+"");}
                if(fuhao=='^'){caluse.insert(i,int_to_str(pow(i1,i2))+"");}
                caluse.erase(i-add,i-starti);
            }
            else{
                i-=add;
            }
        }
        i++;
    }
    cout<<caluse<<endl;
}
int main(){
    string s1;
    cin>>s1;
    change(s1);
    stack<long long> s;
    long long num=0;
    long long i=0;
    cout<<back<<endl;
    for(int i=0;i<back.size();i++){
        caluse+=back[i];
    }
    i=0;
    while(i<back.size()){
        char c=back[i];
        if(c>='0' and c<='9'){
            num=num*10+(c-'0');
        }
        else if(c=='+'){
            long long i1=s.top();
            s.pop();
            long long i2=s.top();
            s.pop();
            s.push(i2+i1);
            print(i1,i2,c);
            // cout<<caluse<<endl;
        }
        else if(c=='-'){
            long long i1=s.top();
            s.pop();
            long long i2=s.top();
            s.pop();
            s.push(i2-i1);
            print(i1,i2,c);
            // cout<<caluse<<endl;
        }
        else if(c=='*'){
            long long i1=s.top();
            s.pop();
            long long i2=s.top();
            s.pop();
            s.push(i2*i1);
            print(i1,i2,c);
            // cout<<caluse<<endl;
        }
        else if(c=='/'){
            long long i1=s.top();
            s.pop();
            long long i2=s.top();
            s.pop();
            s.push(i2/i1);
            print(i1,i2,c);
            // cout<<caluse<<endl;
        }
        else if(c=='^'){
            long long i1=s.top();
            s.pop();
            long long i2=s.top();
            s.pop();
            s.push(pow(i2,i1));
            print(i1,i2,c);
            // cout<<caluse<<endl;
        }
        else if(c==' ' and num!=0){
            s.push(num);
            num=0;
        }
        i++;
    }
    cout<<s.top()<<endl;
}
2021/8/21 16:36
加载中...