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<