C++——スタックを用いて式計算を実現
3455 ワード
実験要求:
スタックの操作を用いて基本式の評価を実現する
コードは次のとおりです.
スタックの操作を用いて基本式の評価を実現する
コードは次のとおりです.
#include
#include
#include
using namespace std;
// : +,- ,* ,/ ,(,),#
//
char operate[7]={'+','-','*','/','(',')','#'};
char prior[7][7] = {
{'>','>','','>'}
,{'>','>','','>'}
,{'>','>','>','>','','>'}
,{'>','>','>','>','','>'}
,{'','>','>','>',' ','>','>'}
,{'= S.stackSize) return ERROR;
S.elem[S.top++] = e;
return OK;
}
int Push(OPTR &S,ElemTypeChar e){
if(S.top >= S.stackSize) return ERROR;
S.elem[S.top++] = e;
return OK;
}
//
int getTop(OPND &S,ElemTypeDouble &e){
if(S.top == 0) return ERROR;
e = S.elem[S.top-1];
return OK;
}
int getTop(OPTR &S,ElemTypeChar &e){
if(S.top == 0) return ERROR;
e = S.elem[S.top-1];
return OK;
}
//
int Pop(OPND &S,ElemTypeDouble &e){
if(S.top ==0) return ERROR;
e = S.elem[S.top-1];
S.top--;
return OK;
}
int Pop(OPTR &S,ElemTypeChar &e){
if(S.top ==0) return ERROR;
e = S.elem[S.top-1];
S.top--;
return OK;
}
//
double ex1(string str,int i,int &j){
int num = 0;
int counter = 0;
while(str[i]>='0'&&str[i]<='9'||str[i]=='.'){
if(str[i]=='.') counter = -1;
if(counter ==1){
num = num*10+str[i]-'0';
counter = 1;
}else if(counter ==0){
num = str[i]-'0';
counter++;
} else{
double t = str[i]-'0';
num = num+t*pow(10,counter);
counter --;
}
i++;
}
j = i;
return num;
}
//
double count(char ch,ElemTypeDouble eL,ElemTypeDouble eR){
switch(ch){
case '+':return eL+eR; break;
case '-':return eL-eR; break;
case '*':return eL*eR; break;
case '/':if(eR==0)return 0;
else return eL/eR; break;
default: return 0; break;
}
}
//
int getIndex(char ch){
for(int i =0;i<7;i++){
if(ch == operate[i])
return i;
}return ERROR;
}
//
int IsOperate(char ch){
for(int j =0;j<7;j++){
if(ch == operate[j])return OK;
}
return ERROR;
}
//
int EvalutionExpression(string str,ElemTypeDouble &result){
int i;
ElemTypeChar ch;
ElemTypeDouble eR,eL;
int m,n;
OPTR S1;
OPND S2; //S1: ,S2:
initStack(S1); //
initStack(S2);
Push(S1,'#');
for(i=0;str[i]!='\0';i++) ;
str[i] = '#';
str[i+1] = '\0';
i=0;
getTop(S1,ch);
while(ch!='#' || str[i]!='#'){
// str
if(IsOperate(str[i])) // str[i]
{ // :
m = getIndex(ch);
n = getIndex(str[i]);
switch(prior[m][n])
{
case '>'://
if(!Pop(S2,eR)) return ERROR;
if(!Pop(S2,eL)) return ERROR;
Pop(S1,ch);
result = count(ch,eL,eR);
Push(S2,result);
getTop(S1,ch);
break;
case '>str;
EvalutionExpression(str,result);
cout<