使用栈,将中缀表达式转化为后缀表达式,并进行计算。

中缀表达式转为后缀表达式,使用全局变量栈进行,遵循五个规则
1 遇到表达式中的数字就输出。
2 遇到表达式中运算符,如果栈为空,直接将其入栈;如果栈内有左括号,直接将其入栈;如果栈内有运算符,没有左括号,需要将二者优先级进行比较, 若表达式运算符高于栈内运算符,则直接入栈;若表达式运算符低于或等于栈内运算符,则将栈内运算符输出到后缀表达式( 请注意 , 若栈内还有表达式   并且符合以上情况,则继续弹出 ),再将表达式运算符入栈。
3 所有的左括号都入栈。
4 若栈内有左括号,运算符都入栈。
5 若遇到了表达式中的右括号,不断进行出栈,将栈内元素输出到后缀表达式中,直到遇到栈内左括号。

使用全局栈
在主函数中使用record字符数组进行记录后缀表达式

代码

include<stdio.h>

include<stdlib.h>

include<string.h>

/*

/
struct stack{
char data[100];
int top;
};
struct stack s;
void InitalStack();//初始化栈
void push(char x);//入栈
int Is_Left_Parenthesis_in_s();//如果栈内有左括号,则返回1
void pop(char
record,int *q);//出栈
int PriorOpt(char c);//判断运算符的优先级
char peek();//暂时没用到
int IsOpt(char c);//判断c是否是运算符

int main(){//一个表达式有三种元素组成,数字,运算符,括号
InitalStack();
char exp[100];
char record[100]={};//记录后缀表达式
scanf("%s",exp);
int q=0;

for(int i=0;i<strlen(exp);i++){//遵循五个规则
	char c=exp[i];
	if(c>='0'&&c<='9'){//如果是数字就直接输出 
		printf("%c",c);//如果是多位数
		record[q++]=c;
		int j=1;
		while(exp[i+j]>='0'&&exp[i+j]<='9'){//当它是数字的时候
			printf("%c",exp[i+j]);
			record[q++]=exp[i+j];
			j++;
		}
		if(j!=1){//如果j等于1,说明c是个位数
			i=j-1+i;
		}
	}else if(IsOpt(c)==1){//如果遇到了运算符
		if(s.top==-1||s.data[0]=='\0'){//如果栈空,直接入栈
			push(c);
		}
		else if(Is_Left_Parenthesis_in_s()==1){//如果栈内有左括号的情况下所有的运算符都入栈
			push(c);	
		}else{//剩下的这种情况,没有左括号,有运算符在栈内
			if(PriorOpt(c)<=s.data[s.top]){//判断二者运算符优先级,分两种情况讨论
				while(PriorOpt(c)<=PriorOpt(s.data[s.top])){
					pop(record,&q);
				}//如果栈内运算符高于或者等于表达式运算符则全部出栈 
				push(c);
			}
			else if(PriorOpt(c)>PriorOpt(s.data[s.top])){
				push(c);
			}
		}
	}else if(c=='('){//如果遇到了左括号直接入栈
		push(c);
	}else if(c==')'){//如果遇到右括号,则不断出栈直到遇到左括号
		while(s.data[s.top]!='('){
			pop(record,&q);
		}if(Is_Left_Parenthesis_in_s()==1){
			pop(record,&q);
		}
	}
}

if(s.top!=-1){//当栈不为空,全部出栈
	pop(record,&q);
}
printf("\n\n\n%s",record);

}

int PriorOpt(char c){
if(c'+'||c'-'){
return 2;
}else if(c'*'||c'/'){
return 9;
}

}
void InitalStack(){
s.top=-1;//栈为空这种状态下
}
void push(char x){//入栈
if(s.top100){
printf("栈满");
return ;
}
s.data[++s.top]=x;
}
void pop(char *record,int *q){
printf("%c",s.data[s.top]);
if(s.data[s.top]
'('){

}else{
	record[(*q)++]=s.data[s.top];
}
s.data[s.top]='\0';
s.top--;

}
char peek(){
return s.data[s.top];
}
int IsOpt(char c){
if(c'+'||c'-'||c'*'||c'/'){
return 1;
}else{
return 0;
}
}
//int IsPriorOpt(char c){//和栈内的运算符进行对比
//
//
//}
int Is_Left_Parenthesis_in_s(){//判断栈内是否有左括号
for(int i=0;i<strlen(s.data);i++){
if(s.data[i]=='('){
return 1;
}
}
return 0;
}

/*
for(int j=1;i+j<strlen(exp);j++){
if(exp[i+j]<'0'&&exp[i+j]>'9'){//如果不是数字了就退出
break;
}
printf("%c",exp[i+j]);
}
*/

int IsVaild(char exp[]){
for(int i=0;i<strlen(exp);i++){
if(exp[i]'('&&exp[i+1]')'){
return 0;//只要是返回0的都是错误的
}else if(exp[i]')'&&exp[i+1]'('){
return 0;
}else if(exp[i]'*'&&exp[i+1]''){
return 0;
}else if(exp[i]=='
'&&exp[i+1]'/'){
return 0;
}else if(exp[i]
'/'&&exp[i+1]=='*'){
return 0;
}else{
return 1;
}
}
}

posted @   华践  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示