#include<stdio.h>#include<string.h>#include<stdlib.h>#include<stdbool.h>// 判断是否是运算符boolisoperator(char c){switch(c){case'+':case'-':case'*':case'/':returntrue;default:returnfalse;}}// 判断是否是阿拉伯数字boolisnumber(char c){return c >='0'&& c <='9';}// 1.判断圆括号是否匹配boolbracketCheck1(char arry[]){int len =strlen(arry);int k =0;// k用来模拟栈for(int i =0; i < len; i++){if(arry[i]=='('){
k++;}if(arry[i]==')'){
k--;}if(k <0)returnfalse;}if(k ==0){returntrue;}returnfalse;}// 2.判断中缀表达式中是否只含有运算符和阿拉伯数字和括号boolnumber_operatorCheck(char arry[]){int len =strlen(arry);for(int i =0; i < len; i++){if(!isoperator(arry[i])&&!isnumber(arry[i])&& arry[i]!='('&& arry[i]!=')'){returnfalse;}}returntrue;}// 3.判断操作符左右元素是否合法booladjacent_operatorCheck(char arry[]){int len =strlen(arry);for(int i =0; i < len; i++){if(arry[i]=='-'){//-当作负号来使用而不是减号if(i ==0|| arry[i -1]=='('){
i++;}}if(isoperator(arry[i])){// 第一个字符是除"-"号外的运算符,最后一个字符是运算符if(i ==0|| i == len -1){returnfalse;}if(isoperator(arry[i -1])||isoperator(arry[i +1])){// 两个及以上的运算符连在一起returnfalse;}if(arry[i -1]=='('|| arry[i +1]==')'){// 出现'('后直接连接运算符,运算符后直接连接')'returnfalse;}}}returntrue;}// 4.两个括号直接相连,或者括号里没东西boolbracketCheck2(char arry[]){int len =strlen(arry);for(int i =0; i < len; i++){if(arry[i]=='('&& arry[i +1]==')'){returnfalse;}if(arry[i]==')'&& arry[i +1]=='('){returnfalse;}}returntrue;}intmain(){char s[200];scanf("%s", s);if(bracketCheck1(s)&&number_operatorCheck(s)&&adjacent_operatorCheck(s)&&bracketCheck2(s)){printf("yes");return0;}printf("no");return0;}
中缀表达式的计算
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdbool.h>int numbers[100];char operators[100];int num, ope;intoperators_compare(char c){switch(c){case'+':return10;case'-':return10;case'*':return20;case'/':return20;default:return5;}}// 判断是否是阿拉伯数字boolisnumber(char c){return c >='0'&& c <='9';// 修改:简化判断逻辑}voidback_num(int operator_numbers[],int&index,char c){if(index<2)return;if(c =='+'){int term = operator_numbers[index]+ operator_numbers[index -1];
index--;
operator_numbers[index]= term;}// 除了"+"和"*",其余的要注意顺序if(c =='-'){int term = operator_numbers[index -1]- operator_numbers[index];
index--;
operator_numbers[index]= term;}if(c =='*'){int term = operator_numbers[index]* operator_numbers[index -1];
index--;
operator_numbers[index]= term;}if(c =='/'){int term = operator_numbers[index -1]/ operator_numbers[index];
index--;
operator_numbers[index]= term;}}intfinal_target(char s[]){int len =strlen(s);int i =0;while(i < len){if(isnumber(s[i])){// 修改:解析多位数字int val =0;while(i < len &&isnumber(s[i])){
val = val *10+(s[i]-'0');
i++;}
i--;// 回退一步,因为外层循环会增加i
numbers[++num]= val;}else{if(s[i]=='('){
operators[++ope]= s[i];}if(s[i]==')'){while(ope >0&&operators [ope]!='('){back_num(numbers, num, operators[ope]);
ope--;}if(ope >0)
ope--;// 弹出左括号}else{// 修改:正确处理运算符优先级while(ope >0&&operators_compare(s[i])<=operators_compare(operators[ope])){back_num(numbers, num, operators[ope]);
ope--;}
operators[++ope]= s[i];}}
i++;}while(ope >0){back_num(numbers, num, operators[ope]);
ope--;}return numbers[1];}intmain(){char s[100];scanf("%s", s);int target=final_target(s);printf("%d", target);}
合并
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<stdbool.h>int numbers[100];char operators[100];int num, ope;// 判断是否是运算符boolisoperator(char c){switch(c){case'+':case'-':case'*':case'/':returntrue;default:returnfalse;}}// 判断是否是阿拉伯数字boolisnumber(char c){return c >='0'&& c <='9';}// 1.判断圆括号是否匹配boolbracketCheck1(char arry[]){int len =strlen(arry);int k =0;// k用来模拟栈for(int i =0; i < len; i++){if(arry[i]=='('){
k++;}if(arry[i]==')'){
k--;}if(k <0)returnfalse;}if(k ==0){returntrue;}returnfalse;}// 2.判断中缀表达式中是否只含有运算符和阿拉伯数字和括号boolnumber_operatorCheck(char arry[]){int len =strlen(arry);for(int i =0; i < len; i++){if(!isoperator(arry[i])&&!isnumber(arry[i])&& arry[i]!='('&& arry[i]!=')'){returnfalse;}}returntrue;}// 3.判断操作符左右元素是否合法booladjacent_operatorCheck(char arry[]){int len =strlen(arry);for(int i =0; i < len; i++){if(arry[i]=='-'){//-当作负号来使用而不是减号if(i ==0|| arry[i -1]=='('){
i++;}}if(isoperator(arry[i])){// 第一个字符是除"-"号外的运算符,最后一个字符是运算符if(i ==0|| i == len -1){returnfalse;}if(isoperator(arry[i -1])||isoperator(arry[i +1])){// 两个及以上的运算符连在一起returnfalse;}if(arry[i -1]=='('|| arry[i +1]==')'){// 出现'('后直接连接运算符,运算符后直接连接')'returnfalse;}}}returntrue;}// 4.两个括号直接相连,或者括号里没东西boolbracketCheck2(char arry[]){int len =strlen(arry);for(int i =0; i < len; i++){if(arry[i]=='('&& arry[i +1]==')'){returnfalse;}if(arry[i]==')'&& arry[i +1]=='('){returnfalse;}}returntrue;}// 以上为判断四则表达式是否正确所用函数,以下为计算中缀表达式值的函数(共用isnumber函数)intoperators_compare(char c){switch(c){case'+':return10;case'-':return10;case'*':return20;case'/':return20;default:return5;}}voidback_num(int operator_numbers[],int&index,char c){if(index <2)return;if(c =='+'){int term = operator_numbers[index]+ operator_numbers[index -1];
index--;
operator_numbers[index]= term;}// 除了"+"和"*",其余的要注意顺序if(c =='-'){int term = operator_numbers[index -1]- operator_numbers[index];
index--;
operator_numbers[index]= term;}if(c =='*'){int term = operator_numbers[index]* operator_numbers[index -1];
index--;
operator_numbers[index]= term;}if(c =='/'){int term = operator_numbers[index -1]/ operator_numbers[index];
index--;
operator_numbers[index]= term;}}intfinal_target(char s[]){int len =strlen(s);int i =0;while(i < len){if(isnumber(s[i])){// 修改:解析多位数字int val =0;while(i < len &&isnumber(s[i])){
val = val *10+(s[i]-'0');
i++;}
i--;// 回退一步,因为外层循环会增加i
numbers[++num]= val;}else{if(s[i]=='('){
operators[++ope]= s[i];}if(s[i]==')'){while(ope >0&& operators[ope]!='('){back_num(numbers, num, operators[ope]);
ope--;}if(ope >0)
ope--;// 弹出左括号}else{// 修改:正确处理运算符优先级while(ope >0&&operators_compare(s[i])<=operators_compare(operators[ope])){back_num(numbers, num, operators[ope]);
ope--;}
operators[++ope]= s[i];}}
i++;}while(ope >0){back_num(numbers, num, operators[ope]);
ope--;}return numbers[1];}intmain(){char s[200];scanf("%s", s);if(bracketCheck1(s)&&number_operatorCheck(s)&&adjacent_operatorCheck(s)&&bracketCheck2(s)){int target =final_target(s);printf("%d", target);return0;}printf("no");return0;}