1 Star 1 Fork 0

陈旭文/2024北理工刷题

Create your Gitee Account
Explore and code with more than 13.5 million developers,Free private repositories !:)
Sign up
文件
This repository doesn't specify license. Please pay attention to the specific project description and its upstream code dependency when using it.
Clone or Download
2024北理工软工(数据结构与算法)8.表达式求值 5.02 KB
Copy Edit Raw Blame History
#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;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/CoderChenXW/code-design-practice.git
git@gitee.com:CoderChenXW/code-design-practice.git
CoderChenXW
code-design-practice
2024北理工刷题
master

Search