⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 biaodashi.cpp

📁 表达式求值
💻 CPP
字号:
#include <stdio.h>
#include <iostream.h>
///////////////////////////////////////
typedef struct{
	double *base;
	double *top;
	int stacksize;
}Double_SqStack;
////////////////////////////////////////////////
typedef struct{
	char *base;
	char *top;
	int stacksize;
}Char_SqStack;
//////////////// //////////////////////////////
void InitStack(Double_SqStack &S,int maxsize);
int Push(Double_SqStack &S,double e);
void Pop(Double_SqStack &S,double &e);
int StackEmpty(Double_SqStack S);
double Gettop(Double_SqStack S);
void InitStack(Char_SqStack &S,int maxsize);
int Push1(Char_SqStack &S,char e);
void Pop(Char_SqStack &S,char &e);
int StackEmpty(Char_SqStack S);
char Gettop(Char_SqStack &S);
char precede(char c,char ch);
int In(char ch);
double js(char a[]);

//////////////////////////////////////////////
void InitStack(Double_SqStack &S,int maxsize){
	S.base = new double[maxsize];
	S.top = S.base;
	S.stacksize=maxsize;
}
int Push(Double_SqStack &S,double e){
	if(S.top-S.base>=S.stacksize)
		return 0;
	*S.top++=e;
	    return 1;
}
void Pop(Double_SqStack &S,double &e){

	
	e=*--S.top;
	    
}
int StackEmpty(Double_SqStack S){
	if(S.base==S.top)
		return 1;
	else return 0;
}

double  Gettop(Double_SqStack S){
	
	return *(S.top-1);
	
}

/////////////////////////////////////////////
void InitStack(Char_SqStack &S,int maxsize){
	
	S.base = new char[maxsize];
	if(!S.base)cout<<"失败!"<<endl;
	S.top=S.base;
	S.stacksize=maxsize;
}
int Push(Char_SqStack &S,char e){
	
	if(S.top-S.base>=S.stacksize)
	return 0;
	 *S.top++=e;
	return 1;
}
void Pop(Char_SqStack &S,char &e){
	
	e=*--S.top;
	    
}
int StackEmpty(Char_SqStack S){
	if(S.base==S.top)
		return 1;
	else return 0;
}


char Gettop(Char_SqStack &S){
	
	return *(S.top-1);

}
//////////////////////////////////////////////////

///////////////////////////////////////////////////
int In(char ch){
	if(ch=='-'||ch=='+'||ch=='*'||ch=='/'||
		ch=='('||ch==')'||ch=='#')
		return 1;
	else return 0;
}

char Precede(char c,char ch){
	switch(c){
	case '+':if(ch=='+'||ch=='-'||ch==')'||ch=='#')
			 {return '>';break;}
		     else {return '<';break;}
	case'-':if(ch=='+'||ch=='-'||ch==')'||ch=='#')
			 {return '>';break;}
		     else {return '<';break;}
	case'*':if(ch=='(')
			{return '<';break;}
		    else {return '>';break;}
    case'/':if(ch=='(')
			{return '<';break;}
		    else {return '>';break;}
	case'(':if(ch==')')
			{return '=';break;}
		   if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='(')
		   {return '<';break;}
	case')':if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch==')'||ch=='#')
			{return '>';break;}
	case'#':if(ch=='#')
			{return '=';break;}
		  if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='(') 
		  {return '<';break;}
		  }
}

double Operate(double a,char theta,double b){
	
	
	
	
	switch(theta){
	case'+': return a+b;break;
    case'-': return a-b;break;
    case'*': return a*b;break;
	case'/': return a/b;break;
	}
}


////////////////////////////////////////////////////
double js(char z[]){
	char *p=z;int i=0;double d=0,d1=0,d2=0,m;int t=0; int q=0;int e=0;int u=0;int v=0;
	Char_SqStack OPTR; 
	Double_SqStack OPND;
	InitStack(OPTR,100);
	InitStack(OPND,100);
	Push(OPTR,'#');
	char theta,x, c=p[i];
	double a,b;
	while(c!='#'||Gettop(OPTR)!='#'){
		while(!In(c))
		{   q=1;
		    if(p[i]=='.')
			{e=i;u=1;}
		    i++;c=p[i];
		}
		
		if(u==0){
			d=p[i-1]-48;
		for(int j=i-2;j>=t;j--){
			m=p[j]-48;
			for(int k=0;k<i-j-1;k++)
			{   
				m=m*10;}
			    d=d+m;
		}
		
		}

		if(u==1){
			v=i;
			i=e;
			d1=p[i-1]-48;
		for(int j=i-2;j>=t;j--){
			m=p[j]-48;
			for(int k=0;k<i-j-1;k++)
			{   
				m=m*10;}
			    d1=d1+m;
		}
		t=e+1;
		i=v;
        	
		for(int x=i-1;x>=t;x--){
			m=p[x]-48;
			for(int k=0;k<x+1-t;k++)
			{   
				m=m*0.1;}
			    d2=d2+m;
		}
        d=d1+d2;d2=0;d1=0;
		}
		if(q==1)
		{      q=0;Push(OPND,d); d=0;u=0;   }
        t=i+1;
            
		
			switch(Precede(Gettop(OPTR),c)){
			case'<':
				Push(OPTR,c);i++;c=p[i];
				break;
			case'=':Pop(OPTR,x);i++;c=p[i];
				break;
			case'>':
				Pop(OPTR,theta);
				Pop(OPND,b);Pop(OPND,a);
				Push(OPND,Operate(a,theta,b));
				break;
		}
	}
	return Gettop(OPND);
}
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
void main(){
			int w=1;
			do{
	cout<<"请输入您要计算的表达式:(如:3+4*(6-9/2)-2*2#"<<endl;
	char a[100];
	char c;
	int j=0;

	cin>>c;
	if(c=='-')
	{	
		a[j]='0';j++;
	}
	a[j]=c;
	j++;
	do{
		cin>>c;
		if(a[j-1]=='('&&c=='-')
		{
			a[j]='0';j++;
		}
		
		a[j]=c;
		j++;
	}while(a[j-1]!='#');
	


		cout<<"计算结果是:"<<js(a)<<endl;
		cout<<"还要继续运算吗?1/0"<<endl;
			cin>>w;
	}while(w);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -