/*此算法可以运算 ‘+‘, ’-‘,’*‘ ,’/‘ 四则运算,输入公式为手动输入,欢迎大家借鉴指教*/
/*需要拷贝的用户直接拷贝即可运行,但要注明头文件类型!*/
/*编程人:吉祥*/
#include<iostream>
using namespace std;const int stacksize=1000;
template<typename T>
class stack
{
private:
T *data;
int top;
public:
stack(){data=new T[stacksize];top=-1;}
~stack(){delete []data;}
void push(T x);
T pop();
T gettop();
};
template<typename T>
void stack<T>::push(T x)
{
if(top==stacksize-1)
throw"wrong";
data[++top]=x;
}
template<typename T>
T stack<T>::gettop()
{
if(top==-1)
throw"wrong";
return data[top];
}
template<typename T>
T stack<T>::pop()
{
return data[top--];
}
const char bijiao[7][7]={
/* + *//* - *//* * *//* / *//* ( *//* )*//* # */
/* + */ '>', '>', '<', '<', '<', '>', '>',
/* - */ '>', '>', '<', '<', '<', '>', '>',
/* * */ '>', '>', '>', '>', '<', '>', '>',
/* / */ '>', '>', '>', '>', '<', '>', '>',
/* ( */ '<', '<', '<', '<', '<', '=', '>',
/* )*/ '>', '>', '>', '>', ' ', '>', '>',
/* # */ '<', '<', '<', '<', '<', '<', '<',
};
const char List[7]={'+','-','*','/','(',')','#'};
bool Good(char j)
{
for(int i=0;i<7;i++)
if(j==List[i])return true;
return false;
}
int Locate(char j)
{
for(int i=0;i<7;i++)
if(j==List[i])
return i;
}
char prefer(char a,char b)
{
return bijiao[Locate(a)][Locate(b)];
}
char fuhao(double a,double b,char c)
{
switch(c)
{
case'+':
return a+b;
case'-':
return a-b;
case'*':
return a*b;
case'/':
return a/b;
}
}
double DO(char *t)
{
stack<double> OPND;
stack<char> OPTR;
OPTR.push('#');
char *c;char br[]={'#'};
c=strcat(t,br);
int f,g;double d; char e;
while(*c!='#'||OPTR.gettop()!='#')
{
if(!Good(*c))
{
d=atof(c);
OPND.push(d);
*c++;
}
else
{
switch(prefer(OPTR.gettop(),*c))
{
case'>':
e=OPTR.pop();
f=OPND.pop();
g=OPND.pop();
OPND.push(fuhao(g,f,e));
break;
case'<':
OPTR.push(*c); c++; break;
case'=':
e=OPTR.pop(); c++; break;
}
}
}
return OPND.gettop();
}
void main()
{
char a[200];
cout<<"请输入公式"<<endl;
cin>>a;
cout<<"答案为"<<DO(a)<<endl;
}