Fetch the repository succeeded.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<math.h>
#define Nul 0x00
char cur[100];
char *p=cur;
int operationgFlag=0;
char PRI[9][9]= /* 优先级表 */
{
{'>','>','<','<','<','<','<','>','>'},
{'>','>','<','<','<','<','<','>','>'},
{'>','>','>','>','<','<','<','>','>'},
{'>','>','>','>','<','<','<','>','>'},
{'>','>','>','>','>','<','<','>','>'},
{'>','>','>','>','>','<','<','>','>'},
{'<','<','<','<','<','<','<','=',Nul},
{'>','>','>','>','>','>',Nul,'>','>'},
{'<','<','<','<','<','<','<',Nul,'='}
};
int signswitch( char a ) /* 符号转换 */
{
switch( a )
{ case '+': return 0; case '-': return 1;
case '*': return 2; case '/': return 3;
case '%': return 4; case '^': return 5;
case '(': return 6; case ')': return 7;
case '#': return 8;
}
}
char refusal(int i,int j){
return PRI[i][j];
}
typedef struct optr{
char op[100];
int top;
}OPTR;
typedef struct opnd{
int num[100];
int top;
}OPND;
void initoptr(OPTR *optr){
optr->op[0]='#';
optr->top=1;
}
void initopnd(OPND *opnd){
opnd->top=0;
}
void pushoptr(OPTR *optr,char a){
optr->op[optr->top++]=a;
}
void pushopnd(OPND *opnd,int a){
opnd->num[opnd->top++]=a;
}
char popoptr(OPTR *optr){
return optr->op[--optr->top];
}
int pooopnd(OPND *opnd){
return opnd->num[--opnd->top];
}
int change(){
int b=0;
b=b*10+*p-'0';
p++;
while(*p<='9'&&*p>='0'){
b=b*10+*p-'0';
p++;
}
return b;
}
int operation(int x, int y, char a) {
switch( a )
{ case '+': return x+y;
case '-': return x-y;
case '*': return x*y;
case '/': if ( y ) return x/y;
else { printf("Divide 0.\n"); operationgFlag=1; return 0;}
case '%': return ((long int) fmod(x,y));
case '^': if (y>=0 ) return pow(x,y);
else { printf("error.\n"); operationgFlag=1; return 0;}
}
}
int main (){
OPTR *optr=(OPTR*)malloc(sizeof(OPTR));
OPND *opnd=(OPND*)malloc(sizeof(OPND));
int N; //N是题目中表达式的数量
scanf("%d\n",&N);
int flag=0; //flag是用来判断括号是否已经成对的标志
int n1,n2; //这三个参数,后面用到的是后你会明白的
char op;
while(N--){
initoptr(optr); //然后是初始化这些参数
initopnd(opnd);
flag=0;
operationgFlag=0; //判断是否除数为0的标志
scanf("%s",cur); //用cur接收一个表达式
strcat(cur,"#"); //strcat将 # 插入cur尾部
//这个地方重点说明一下,大家看一下OPND的初始化
//第一位也放了一个#,这是为了与这里放入的成对
//表示一个完整表达式的结束
while(*p!='#'||optr->op[optr->top-1]!='#'){
if(*p<='9'&&*p>='0'){ //然后开始遍历这个表达式
int num=change(); //中止条件就是p到了最后一个#,或者OPTR
pushopnd(opnd,num); //中没有运算符了
} //理解了的话可以去看change
else{
if(*p=='('&&optr->top-1==0&&opnd->top!=0){
printf("error.\n"); //然后就是这几行,目的是判断表达式
goto h; //是否有问题,我举了例子在下面
}
if ( flag==1 && *p=='(' ) {
printf("error.\n");
goto h;
}
else if ( *p==')')
flag = 1;
else
flag = 0;
switch(refusal(optr->op[optr->top-1],*p)){ //后面的逻辑就比较简单了
case'<':pushoptr(optr,*p);p++;break; //当前运算符优先级更高,直接入栈
case'=':popoptr(optr);p++;break; //这里提醒大家看下优先级表中
case'>': //只有一种情况会相等哦
n1=pooopnd(opnd); //当优先级更低时
n2=pooopnd(opnd); //这里就用到n1、n2、op了
op=popoptr(optr); //很好理解是什么吧?
n2=operation(n1,n2,op); //就是用来接收出栈的两个数和一个运算符
if(operationgFlag==1){ //然后大家理解了这里,就可以去看operation
goto h;
}
else{
pushopnd(opnd,n2);
break;
}
case Nul:
printf("error.\n");
goto h;
}
}
}
if(opnd->top-1 == 0) //数字栈中只有一个数,那就是最终结果
printf("%d\n",opnd->num[opnd->top]); /* 输出 */
else
printf("error.\n");
h:; /* 继续下一个 */
}
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。