求助(玄关)
  • 板块灌水区
  • 楼主_wronganswer_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/8 20:17
  • 上次更新2024/8/8 21:14:16
查看原帖
求助(玄关)
593492
_wronganswer_楼主2024/8/8 20:17

P1175 表达式的转换

#include <bits/stdc++.h>
using namespace std;
struct node{
	int l,r,v;
	char op;
}tree[1100];
int id;
int level(char c){
	if(c=='+'||c=='-')return 1;
	if(c=='*'||c=='/')return 2;
	if(c=='^')return 3;
	return 0;
}
void calc(stack<int> &st,stack<char> &op){
	int R=st.top();st.pop();
	int L=st.top();st.pop();
	++id;
	tree[id].l=L;
	tree[id].r=R;
	tree[id].op=op.top();
	op.pop();
	switch(tree[id].op){
		case '+':tree[id].v=tree[L].v+tree[R].v;break;
		case '-':tree[id].v=tree[L].v-tree[R].v;break;
		case '*':tree[id].v=tree[L].v*tree[R].v;break;
		case '/':tree[id].v=tree[L].v/tree[R].v;break;
		case '^':tree[id].v=(int)pow(tree[L].v,tree[R].v);break;
	}
	st.push(id);
}
void build(string s){
	stack<int>st;
	stack<char>op;
	s='('+s+')';
	for(int i=0;i<s.size();++i){
		if(s[i]>='0'&&s[i]<='9'){
			tree[++id].l=s[i]-'0';
			tree[id].r=0;
			tree[id].v=0;
			tree[id].op=0;
			st.push(id);
		}
		else{
			if(s[i]=='('||s[i]=='^')op.push(s[i]);
			else if(s[i]==')'){
				while(op.top()!='(')calc(st,op);
				op.pop();
			}
			else{
				while(!op.empty()&&level(op.top())>=level(s[i]))calc(st,op);
				op.push(s[i]);
			}
		}
	}
}
void write(int p){
	if(!p)return;
	write(tree[p].l);
	write(tree[p].r);
	if(tree[p].op)cout<<tree[p].op;
	else cout<<tree[p].v;
	if(p==id)cout<<"\n";
	else cout<<" ";
}
void solve(int p){
	if(!tree[p].op)return;
	solve(tree[p].l);
	solve(tree[p].r);
	tree[p].op=tree[p].l=tree[p].r=0;
	write(id);
}
int main(){
	string s;
	cin>>s;
	build(s);
	write(id);
	solve(id);
}

0分

2024/8/8 20:17
加载中...