发那科粗镗孔:用C/C++ 编写“利用栈实现表达式求值”

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/04 13:31:54
编写一个过程,用于入栈操作
编写一个过程,用于出栈操作
编写一个过程,用于表达式求值算法操作
编写一个过程,用于打印(显示)最终结果
编写一个主程序,通过输入字符I、O、P实现简单交互
调试程序:A/B*C+D
希望能在VC上运行

#include<iostream>
#include<cmath>
using namespace std;
const double PI=3.141592654;
const int SZ=1000;
int MKAC=0;
double STP=1;

template <class Type>
class STACK{
private:
Type base[SZ];
int Size;
public:

STACK(){Size=0;};
void push(Type a) //入栈
{
base[Size]=a;
Size++;
}
Type pop() //出栈
{
return base[--Size];
}
int size()
{return Size;}
};

bool IsData(char ch)
{
return ((ch>='0'&&ch<='9')||ch=='.')?true:false;
}

bool IsSym(char ch)
{
return (ch=='+'||ch=='-'||ch=='*'||ch=='/')?true:false;
}

int IsPar(char ch)
{
return ch=='\x28'?1:ch=='\x29'?-1:0;
}

int Priority(char ch) //符号的优先极别
{
switch(ch)
{
case '+':
return 0;
case '-':
return 0;
case '*':
return 1;
case '/':
return 1;
default:
return -1;
}
}
bool Check(char *ch)
{
int a=0;
for(int i=0;i<strlen(ch);i++)
if(ch[i]=='.')
a++;
if(a>1)
return false;
return true;
}

double ToArc(double alpha){return (PI*alpha/180.0);}

double ToDgr(double arc){return (180*arc/PI);}

double ToData(char* ch)
{
int i,j,sumn=0;
double sum=0.0;
if(!Check(ch)) return 0.0;
for(i=0;i<strlen(ch);i++)
{if(ch[i]!='.')
sumn=sumn*10+(ch[i]-'0');
else break;
}
if(i<strlen(ch))
for(j=i+1;j<strlen(ch);j++)
sum=sum*10+(ch[j]-'0');
sum/=pow(10.0,(double)(strlen(ch)-1-i));
return (sum+sumn);
}

double Call(double sum,double data,char ch)//根据运算计算数据
{
double ans=0.0;
switch(ch)
{
case '+':
ans=sum+data;
break;
case '-':
ans=sum-data;
break;
case '*':
ans=sum*data;
break;
case '/':
ans=sum/data;
break;
default:ans=0.0;
break;
}
return ans;
}

int GetMatch(char* buffer,int pos)//找到匹配的括号
{
STACK<char> Temp;
int i;
for(i=pos;i<strlen(buffer);i++)
{if(IsPar(buffer[i])==1)
Temp.push('0');
if(IsPar(buffer[i])==-1)
{Temp.pop();
if(Temp.size()==0) return i;
}
}
return -1;
}

int NL(int n)
{
if(n==0)
return 1;
else return n*NL(n-1);
}

void Opr(STACK<char>& symbol,STACK<double>& data,int& mark)
{
double sum;
while(symbol.size()!=0)
{char tem=symbol.pop();
int temp=Priority(tem);
symbol.push(tem);
if(temp<mark)
break;
else{
sum=Call(data.pop(),data.pop(),symbol.pop());
data.push(sum);
}
}
}

double Calculate(char* buffer,double& sum)//主运算部分
{
STACK<double> data;
STACK<char> symbol;
double ans;
char temp[SZ];
int ct=0,mark=0,tp=0;
data.push(sum);
while(ct<=strlen(buffer))
{
if(IsData(buffer[ct]))
{
while(ct<strlen(buffer)&&IsData(buffer[ct]))
temp[tp++]=buffer[ct++];
temp[tp]='\0';
tp=0;
ans=ToData(temp);
data.push(ans);
if(buffer[ct]=='!') {data.push(NL((int)data.pop()));ct++;}
if(ct==strlen(buffer))
{mark=0;
Opr(symbol,data,mark);
sum=data.pop();
return sum;
}
else{
int mark=Priority(buffer[ct]);
Opr(symbol,data,mark);
}
}
else if(IsSym(buffer[ct]))
symbol.push(buffer[ct++]);
else{
char BF[100];int k=0;
while(IsPar(buffer[ct])!=1&&ct<=strlen(buffer))
BF[k++]=buffer[ct++];
BF[k]='\0';
if(IsPar(buffer[ct])==1)
{int i,j;
char Temp[100];
for(i=ct+1,j=0;i<GetMatch(buffer,ct);i++,j++)
Temp[j]=buffer[i];
Temp[j]='\0';
data.push(Calculate(Temp,sum));

ct+=(strlen(Temp)+1);
if(ct+1==strlen(buffer))
{mark=0;
Opr(symbol,data,mark);
sum=data.pop();
return sum;
}
else{
mark=Priority(buffer[ct+1]);
Opr(symbol,data,mark);
}
ct++;
}
}
}
return 0.;
}

int main()
{
char buffer[SZ];
double sum=0.0;
cout.precision(12);
while(cin>>(buffer)) //输入
{
cout<<Calculate(buffer,sum)<<endl;//计算和输出
}
return 0;
}

//编译环境:Dev C++,VC++
//运行示例:
输入:1+2*3-4
输出:3