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

📄

📁 表达式求值 用户按平时习惯输入数字算术表达式(即中缀表达式)后
💻
字号:
#include<stdio.h>
#include<string.h>
typedef struct{
	char data[100];
	int top;
}Stack;
typedef struct{
	float data[100];
	int top;
}NumStack;

void Init(Stack &s){
	s.top=-1;
}
void NumInit(NumStack &s){
	s.top=-1;
}

int StackEmpty(Stack s){
	return s.top==-1;
}
int NumStackEmpty(NumStack s){
	return s.top==-1;
}

int StackFull(Stack s){
	return s.top==99;
}
int NumStackFull(NumStack s){
	return s.top==99;
}

void Push(Stack &s,char x){
	if(StackFull(s))
		printf("stack overflow");
	else s.data[++s.top]=x;
}
void NumPush(NumStack &s,float x){
	if(NumStackFull(s))
		printf("stack overflow");
	else s.data[++s.top]=x;
}

char Pop(Stack &s){
	if(StackEmpty(s)){
		printf("stack underflow");
		return 0;
	}
	else return s.data[s.top--];
}
float NumPop(NumStack &s){
	if(NumStackEmpty(s)){
		printf("stack underflow");
		return 0;
	}
	else return s.data[s.top--];
}

char GetTop(Stack s){
	if(StackEmpty(s)){
		printf("stack is empty");
		return 0;
	}
	else return s.data[s.top];
}
float NumGetTop(NumStack s){
	if(NumStackEmpty(s)){
		printf("stack is empty");
		return 0;
	}
	else return s.data[s.top];
}

Stack Change(char e[]){
	Stack a,s2;
	int i=0;
	char w;
	Init(a);
	Init(s2);
	while(e[i]){
		if('0'<=e[i]&&e[i]<='9'){
			while(('0'<=e[i]&&e[i]<='9')||(e[i]=='.')){
				Push(a,e[i]);
				i++;
			}
			Push(a,' ');
		}
		if(!e[i]) break;
		if(e[i]=='(') Push(s2,e[i]);
		if(e[i]==')'){
			w=Pop(s2);
			while(w!='('){
				Push(a,w);
				w=Pop(s2);
			}
		}
		if((e[i]=='+')||(e[i]=='-')){
			if(!StackEmpty(s2)){
				w=GetTop(s2);
				while(w!='('){
					Push(a,w);
					w=Pop(s2);
					if(StackEmpty(s2)) break;
					else w=GetTop(s2);
				}
			}
			Push(s2,e[i]);
		}
		if((e[i]=='*')||(e[i]=='/')){
			if(!StackEmpty(s2)){
				w=GetTop(s2);
				while((w=='*')||(w=='/')){
					Push(a,w);
					w=Pop(s2);
					if(StackEmpty(s2)) break;
					else w=GetTop(s2);
				}
			}
			Push(s2,e[i]);
		}
		i++;
	}
	while(!StackEmpty(s2)) Push(a,Pop(s2));
	Push(a,'\0');
	return a;
}

float Exchange(char *m){
	float k=0;
	while(*m&&*m!='.')
		k=k*10+(float)(*(m++)-'0');
	if(*m=='.'){
		m++;
		float x=1;
		while(*m){
			x=x/10;
			k=k+x*(float)(*(m++)-'0');			
		}
	}
	return k;
}

float Calculate(char *A){
	NumStack s;
	float j;
	int i=0;
	NumInit(s);
    while(A[i]){
		if('0'<=A[i]&&A[i]<='9'){
			char m[20];
			int n=0;
			while(('0'<=A[i]&&A[i]<='9')||(A[i]=='.'))
				m[n++]=A[i++];
			m[n]='\0';
			NumPush(s,Exchange(m));
		}
		else{
			switch(A[i]){
			case '+':NumPush(s,NumPop(s)+NumPop(s));break;
			case '-':NumPush(s,-(NumPop(s)-NumPop(s)));break;
			case '*':NumPush(s,NumPop(s)*NumPop(s));break;
			case '/':j=NumPop(s);NumPush(s,NumPop(s)/j);break;
			}
		}
		i++;
	}
	return NumPop(s);
}

void main(){
	char e[100];
	Stack a;
	printf("请输入中缀表达式:\n");
	scanf("%s",e);
	a=Change(e);
    printf("对应的后缀表达式为\n");
	printf("%s\n",a.data);
	printf("表达式的值为\n%.2f\n",Calculate(a.data));
}

⌨️ 快捷键说明

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