记录编号 42574 评测结果 AAAAAAAAAA
题目名称 表达式转换 最终得分 100
用户昵称 Gravatarcqw 是否通过 通过
代码语言 C++ 运行时间 0.009 s
提交时间 2012-09-26 16:13:53 内存使用 0.31 MiB
显示代码纯文本
//date:201209
//author:cqw
//way:double stack
#include<fstream>
#include<stack>
#include<vector>
#include<cmath>
using namespace std;
ifstream fin("express.in");
ofstream fout("express.out");
class ep
{
public:int x;char ch;
} ept;
vector<ep> ep1;
stack<char> s2;//运算符栈
vector<char> s1;//后缀串栈(只进不出)
string s;//输入串
int fg(char x)//判定运算符等级
{
	if (x=='+'||x=='-') return 1;
	if (x=='*'||x=='/') return 2;
	if (x=='^') return 3;return 0;
}
void print()//输出结果到ep1
{
	for (int i=0;i<s1.size();i++)//输出后缀串栈
	{
		if (s1.at(i)>='0'&&s1.at(i)<='9')
			ept.x=s1.at(i)-48;else ept.x=-1;
		ept.ch=s1.at(i);
		ep1.push_back(ept);
	}
	while (!s2.empty())//输出运算符栈中剩余全部运算符
	{
		if (s2.top()>='0'&&s2.top()<='9')
			ept.x=s2.top()-48;else ept.x=-1;
		ept.ch=s2.top();
		ep1.push_back(ept);
		s2.pop();
	}
}
void right()
{
	while (s2.top()!='(')//括号内运算符处理
	{
		s1.push_back(s2.top());
		s2.pop();
	}s2.pop();//左括号出栈
}
void op(char x)
{
	while (!s2.empty()&&fg(s2.top())>=fg(x))//级别高的运算符先处理
	{
	   s1.push_back(s2.top());
	   s2.pop();
	}s2.push(x);//运算符入栈
}
bool isch(char x)
{
	if (x=='+'||x=='-'||x=='*'||x=='/'||x=='^') return 1;else return 0;
}
void pp()
{
	for (int i=0;i<ep1.size();i++)
	{
		if (ep1.at(i).x==-1) fout<<ep1.at(i).ch;else fout<<ep1.at(i).x;
		if (i==ep1.size()-1) fout<<endl;else fout<<' ';
	}
}
void zprint()
{
	int i,a,b;pp();
	while (ep1.size()>1)//计算完时只有一项:结果
	{
		i=0;while (ep1.at(i).x!=-1) i++;
		a=ep1.at(i-1).x;b=ep1.at(i-2).x;
		switch (ep1.at(i).ch)//根据运算符计算
	   {
	       case '+':ep1.at(i-2).x=b+a;break;
		   case '-':ep1.at(i-2).x=b-a;break;
		   case '*':ep1.at(i-2).x=b*a;break;
		   case '/':ep1.at(i-2).x=b/a;break;
		   case '^':ep1.at(i-2).x=(int)pow(double(b),double(a));break;
	      default:ep1.at(i-2).x=-1;//正确运行不会执行此句
	   }ep1.erase(ep1.begin()+i);ep1.erase(ep1.begin()+i-1);
	   pp();
	}
}
int main()
{
	fin>>s;
	for (int i=0;i<s.length();i++)
	{
		if (s[i]>='0'&&s[i]<='9') s1.push_back(s[i]);else
			if (s[i]=='(') s2.push(s[i]);else
				if (s[i]==')') right();else 
					op(s[i]);
	}
	print();
	zprint();
	return 0;
}