自己测试正常可是只有第一个点AC
查看原帖
自己测试正常可是只有第一个点AC
1055332
xhzzz楼主2023/10/16 12:40

求佬们帮忙看一下代码

基本思路就是用一个双向链表模拟整个过程

#include<bits/stdc++.h>
using namespace std;
template <typename T>
    struct List {
        struct Node {
            T data;
            Node *prev,*next;
        };
        Node *head,*tail;
        List() {head=tail=nullptr;}
        bool empty() {return head==tail;} 
        Node* rehead() {return head;}
        Node* retail() {return tail;}
        Node* push_back(T n) {
            if(head==nullptr&&tail==nullptr) {
                Node *p=new Node;p->prev=nullptr;p->next=nullptr;p->data=n;
                head=tail=p;
                return p;
            }
            Node *p=new Node;p->next=nullptr;tail->next=p;p->prev=tail;tail=p;
            p->data=n;
            return p;
        }
        Node* push_front(T n) {
            if(head==nullptr&&tail==nullptr) {
                Node *p=new Node;p->prev=nullptr;p->next=nullptr;p->data=n;
                head=tail=p;
                return p;
            }
            Node *p=new Node;p->prev=nullptr;p->next=head;head->prev=p;head=p;
            p->data=n;
            return p;
        }
        Node* insert_front(Node *insert,T n) {
            Node *p=new Node;
            p->prev=insert->prev;p->next=insert;
            if(insert->prev!=nullptr) {(insert->prev)->next=p;insert->prev=p;}
            p->data=n;
            if(p->prev==nullptr) head=p;
            return p;
        }
        Node* insert_back(Node *insert,T n) {
            Node *p=new Node;
            p->prev=insert;p->next=insert->next;
            if(insert->next!=nullptr) {(insert->next)->prev=p;insert->next=p;}
            p->data=n;
            if(p->next==nullptr) tail=p;
            return p;
        }
        bool erase(Node *t) {
            if(t!=nullptr) {
                if(t->prev!=nullptr&&t->next!=nullptr) {
                    Node *prev=t->prev,*next=t->next;
                    prev->next=next;
                    next->prev=prev;
                    delete t;
                    return true;
                } else if(t->prev==nullptr&&t->next!=nullptr) {
                    head=t->next;
                    head->prev=nullptr;
                    delete t;
                } else if(t->prev!=nullptr&&t->next==nullptr) {
                    tail=t->prev;
                    tail->next=nullptr;
                    delete t;
                } else if(t->next==nullptr&&t->prev==nullptr) {
                    delete t;
                }
            } else if(t==nullptr) {
                return false;
            }
            return false;
        }
    };
using Ptr=List<char>::Node*;
string::size_type khf(List<char> &l,string::size_type i,\
                        Ptr origin_last_op,Ptr &num,const string &s)
{
    Ptr last_op=origin_last_op,tail_op=nullptr;
    bool kh=false;
    if(last_op==nullptr) {
        ++i;
        last_op=l.push_back(s[i]);
        for(++i;s[i]!=')';++i) {
            char ch=s[i];
            if(ch>='0'&&ch<='9'&&kh==false) {
                num=l.insert_front(last_op,ch);
            } else if((ch=='+'||ch=='-')&&kh==false) {
                last_op=tail_op=l.push_back(ch);
            } else if((ch=='*'||ch=='/')&&kh==false) {
                if(last_op->data=='+'||last_op->data=='-') {
                    last_op=l.insert_front(last_op,ch);
                } else if(last_op->data=='^'||last_op->data=='*'||last_op->data=='/') {
                    last_op=l.insert_back(last_op,ch);
                    if(last_op->next==nullptr) tail_op=last_op;
                }
            } else if(ch=='^'&&kh==false) {
                last_op=l.insert_front(last_op,ch);
            } else if(ch=='(') {
                i=khf(l,i,last_op,num,s);
            }
        }
    } else if(last_op!=nullptr) {
        for(++i;s[i]!=')';++i) {
            char ch=s[i];
            if(ch>='0'&&ch<='9'&&kh==false) {
                num=l.insert_front(last_op,ch);
            } else if((ch=='+'||ch=='-')&&kh==false) {
                last_op=tail_op=l.insert_front(origin_last_op,ch);
            } else if((ch=='*'||ch=='/')&&kh==false) {
                if(last_op->data=='+'||last_op->data=='-') {
                    last_op=l.insert_front(last_op,ch);
                } else if(last_op->data=='^'||last_op->data=='*'||last_op->data=='/') {
                    last_op=l.insert_back(last_op,ch);
                    if(last_op->next==nullptr) tail_op=last_op;
                }
            } else if(ch=='^'&&kh==false) {
                last_op=l.insert_front(last_op,ch);
            } else if(ch=='(') {
                i=khf(l,i,last_op,num,s);
            }
        }
    }
    num=last_op;
    return i;
}
bool fisop(char ch)
{
    if(ch=='*'||ch=='/'||ch=='+'||ch=='-'||ch=='^') return true;
    else return false;
}
long long fnum(char ch) {return (ch-'0');}
long long fcal(long long chao1,long long chao2,char op)
{
    switch(op) {
        case '+':return (chao1+chao2);break;
        case '-':return chao1-chao2;break;
        case '*':return chao1*chao2;break;
        case '/':return chao1/chao2;break;
        case '^':return pow(chao1,chao2);break;
    }
    return 0;
}
void fprint(List<char> l,long long val)
{
    Ptr head=l.rehead();
    while(head!=nullptr) {
        if(head->data!='@') cout<<head->data<<' ';
        else cout<<val<<' ';
        head=head->next;
    }
    printf("\n");
}
int main()
{
    List<char> l;
    string s;cin>>s;
    Ptr num=nullptr,last_op=nullptr,tail_op=nullptr;
    bool kh=false;
    for(string::size_type i=0;i<s.length();++i) {
        char ch=s[i];
        if(num==nullptr&&last_op==nullptr&&tail_op==nullptr&&ch!='(') {
            num=l.push_back(ch);
        } else if(num!=nullptr&&last_op==nullptr&&tail_op==nullptr&&ch!='(') {
            last_op=tail_op=l.push_back(ch);
        } else if(ch>='0'&&ch<='9'&&kh==false) {
            num=l.insert_front(last_op,ch);
        } else if((ch=='+'||ch=='-')&&kh==false) {
            last_op=tail_op=l.push_back(ch);
        } else if((ch=='*'||ch=='/')&&kh==false) {
            if(last_op->data=='+'||last_op->data=='-') {
                last_op=l.insert_front(last_op,ch);
            } else if(last_op->data=='^'||last_op->data=='*'||last_op->data=='/') {
                last_op=l.insert_back(last_op,ch);
                if(last_op->next==nullptr) tail_op=last_op;
            }
        } else if(ch=='^'&&kh==false) {
            last_op=l.insert_front(last_op,ch);
        } else if(ch=='(') {
            i=khf(l,i,last_op,num,s);
        }
    }
    Ptr head=l.rehead();
    while(head!=nullptr) {
        cout<<head->data<<' ';
        head=head->next;
    }
    cout<<endl;
    long long val=0;
    bool first=true;
    Ptr last_search_position; bool have_last=false;
    while(!l.empty()) {
        Ptr op;
        if(have_last==false) {
            op=l.rehead();
            while(op!=nullptr&&!fisop(op->data)) op=op->next;
            if(op!=nullptr) last_search_position=op->next;
            have_last=true;
        } else if(have_last==true) {
            op=last_search_position;
            while(op!=nullptr&&!fisop(op->data)) op=op->next;
            if(op!=nullptr) last_search_position=op->next;
            have_last=true;
        }
        if(op==nullptr) {
            if(first) {printf("%c\n",l.rehead()->data);return 0;}
            else {
                printf("%lld\n",val);
                return 0;
            }
        } else if(op!=nullptr&&first) {
            Ptr chao2=op->prev;
            Ptr chao1=chao2->prev;
            val=fcal(fnum(chao1->data),fnum(chao2->data),op->data);
            chao1->data='@';
            num=chao1;
            l.erase(chao2);l.erase(op);
            fprint(l,val);
            first=false;
        } else if(op!=nullptr&&first==false&&op->prev==num) {
            Ptr chao2=op->prev;
            Ptr chao1=chao2->prev;
            val=fcal(fnum(chao1->data),val,op->data);
            chao1->data='@';
            num=chao1;
            l.erase(chao2);l.erase(op);
            fprint(l,val);
        } else if(op!=nullptr&&first==false&&(op->prev)->prev==num) {
            Ptr chao2=op->prev;
            Ptr chao1=chao2->prev;
            val=fcal(val,fnum(chao2->data),op->data);
            num=chao1;
            l.erase(chao2);l.erase(op);
            fprint(l,val);
        }
    }
    return 0;
}
2023/10/16 12:40
加载中...