#表达式求值#

来源:互联网 发布:ubuntu试用root密码 编辑:程序博客网 时间:2024/05/19 12:14


/*需要拷贝的用户直接拷贝即可运行,要注明头文件类型!*/

/*此程序使用  ’ +‘,   ’-‘,    ’*‘,   ’/‘,算法运算,手动输入算式*/

/*编程人:吉祥*/

#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;
}

0 0
原创粉丝点击