求佬们帮忙看一下代码
基本思路就是用一个双向链表模拟整个过程
#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;
}