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

📄 biaodashi2.cpp

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

//////////////////////////////////////////////
void InitStack(Link_Double_SqStack &S){
	
	S=NULL;
}
int Push(Link_Double_SqStack &S,double e){
	Link_Double_SqStack s = new Double_SqStack;
	s->date=e;
	s->next=S;
	S=s;
	return 1;
}
void Pop(Link_Double_SqStack &S,double &e){
      Link_Double_SqStack p;
	  p=S;
	 
	  e=p->date;
	  S=p->next;
      delete(p);
	  
}
int StackEmpty(Link_Double_SqStack S){
	if(S==NULL)
		return 1;
	else return 0;
}

double  Gettop(Link_Double_SqStack S){
	
	return S->date;
	
}

/////////////////////////////////////////////
void InitStack(Link_Char_SqStack &S){
	
	S=NULL;
}
int Push(Link_Char_SqStack &S,char e){
	
	Link_Char_SqStack s = new Char_SqStack;
	s->date=e;
	s->next=S;
	S=s;
	return 1;
}
void Pop(Link_Char_SqStack &S,char &e){
	
	Link_Char_SqStack p ;
	  p=S;
	  e=p->date;
	  S=p->next;
	  delete(p);
	    
}
int StackEmpty(Link_Char_SqStack S){
	if(S==NULL)
		return 1;
	else return 0;
}


char Gettop(Link_Char_SqStack &S){
	
	return S->date;

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

///////////////////////////////////////////////////
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;
	Link_Char_SqStack OPTR;
	Link_Double_SqStack OPND;
	InitStack(OPTR);
	InitStack(OPND);
	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 + -