Posted on 2008-10-30 08:48
dengbo 阅读(473)
评论(0) 编辑 收藏 引用
#include "stdafx.h"
#include"c1.h"
#include"c3-1.h"
#include "bo3-1.h"
#include<iostream>
#include<stack>
#include<vector>
#include<string>

using namespace std;


/**//*******定义优先级**********/

/**//**
+ - * / ( ) (进栈符号)
(栈顶符号)
+ > > < < < >

- > > < < < >

* > > > > < >

/ > > > > < >

( < < < < < <

) > > > > > >

***************************/

/**//******* > < 表示栈顶符号和要进栈符号的优先关系,
如果 栈顶符号的优先级>要进栈符号的优先级,执行计算;
如果 栈顶符号的优先级<要进栈符号的优先级,符号进栈***/


/**//*******返回栈顶符号是否优先与进栈符号*******/
char end[]="#";
bool is_prior_exe(char top, char in)


{
if(top == ')')

{
return true;
}
if(top =='(')
return false;
if(top == '*' || top=='/')

{
if(in!='(')
return true;
else

{
return false;
}
}
if(top=='+' || top=='-')

{
if( in=='+' || in=='-' || in==')')

{
return true;
}
if(in=='*' || in=='/' || in=='(')

{
return false;
}
}
}
bool In(char* c)


{
switch(c[0])

{
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case'#':return true;
default:return false;
}
}
vector<char *> get_word(string str)


{
vector<char *> word;
int i=0;
while(i<str.size())

{
if(str[i]=='('||str[i]==')'||str[i]=='*'||str[i]=='/'||str[i]=='+'||str[i]=='-')

{
char *temp = new char[2];
temp[0]=str[i];
temp[1]=='\0';
word.push_back(temp);
}
if((str[i]-'0'>=0 && str[i]-'0'<=9)||str[i]=='.')

{
static int j=-1;
static char *tmp;
if(j==-1)

{
j=i;
tmp=new char[15];

}
tmp[i-j]=str[i];
if(i+1<str.size() && (str[i+1]-'0'<0 || str[i+1]-'0'>9)&&str[i+1]!='.')

{
tmp[i+1-j]='\0';
word.push_back(tmp);
j=-1;
}
else if(i+1==str.size())

{
tmp[i+1-j]='\0';
word.push_back(tmp);
j=-1;
}
}
i++;
}
word.push_back(end);
return word;
}

double ConvertStrToDouble(char * exp)


{
//get integer
int num1=0;
while(*exp!='\0'&& *exp!='.')

{
num1=num1*10+ (*exp-'0');
exp++;
}
if(*exp=='\0')

{
return num1;
}
//get decimal
double num2=0;
while(*exp!='\0')

{
*exp++;
}
*exp--;
while(*exp!='.')

{
num2=num2*0.1+(*exp-'0');
*exp--;
}
num2=num2*0.1;
return num1+num2;
}



double Operate(double a,char theta, double b)


{
//int c;
//a=a-48;
//b=b-48;
double c;
switch(theta)

{
case'+':c=a+b;
break;
case'-':c=a-b;
break;
case'*':c=a*b;
break;
case'/':c=a/b;
}
return c;
}

char Precede(char t1, char t2)


{
char f;
switch(t2)

{
case'+':
case'-':if(t1=='(' || t1=='#')
f='<';
else
f='>';
break;
case'*':
case'/':if(t1=='*' || t1=='/' || t1==')')
f='>';
else
f='<';
break;
case'(':if(t1==')')

{
printf("ERROR\n");
exit(0);
}
else
f='<';
break;
case')':switch(t1)

{
case'(':f='=';
break;
case '#':printf("ERROR2\n");
exit(0);
default:f='>';
}
break;
case'#':switch(t1)

{
case'#':f='=';
break;
case'(':printf("ERROR3\n");
exit(0);
default:f='>';

}
}
return f;
}

double EvaluateExpression(vector<char*> cpvec)


{

stack<char> OPTR;
stack<double> OPND;
//SElemType a,b,c,x,theta;
//InitStack(&OPTR);
//Push(&OPTR,'#');
double num_first,num_second;
char theta;
OPTR.push ('#');

//InitStack(&OPND);
//c=getchar();
//GetTop(OPTR,&x);
char c_top = OPTR.top();
int i=0;
while(i<cpvec.size())

{
if(In(cpvec[i]))

{
char c_in = cpvec[i][0];
bool flg =false;
do

{
switch(Precede(c_top,c_in))

{

case'<':OPTR.push(c_in) ;/**//*Stack top Prior lower Push Stack*/
c_top = OPTR.top();
flg=false;
break;

case'=':OPTR.pop();/**//*off bracketd Pop Stack*/
if(!(OPTR.empty()))
c_top = OPTR.top();
flg=false;
break;
case'>':theta=OPTR.top();

OPTR.pop(); /**//*Stack top Prior higher Pop Stack calculate*/
c_top=OPTR.top();
num_first=OPND.top();
OPND.pop();
num_second=OPND.top();
OPND.pop();
OPND.push (Operate(num_second,theta,num_first));
flg=true;
break;
}
}
while(flg);
}

else if(cpvec[i][0] >='0' && cpvec[i][0]<='9')/**//*c is number*/

{
double tmp = ConvertStrToDouble(cpvec[i]);
OPND.push(tmp);
}

else /**//*c is illegal character*/

{
printf("ERROR$\n");
exit(0);
}
//GetTop(OPTR,&x);
i++;
}
return OPND.top();
}

int _tmain(int argc, _TCHAR* argv[])


{
//printf("Input a arithmetic expression use '#' to end");
char ch;
while((ch=getchar())!=EOF)

{
cout<<"Input a arithmetic expression"<<endl;
string expstr;
cin>>expstr;
vector<char *>cpvec =get_word(expstr);
cout<<"result="<<EvaluateExpression(cpvec)<<endl;
}
system("pause");
return 0;
}

