博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
欢迎大家指导(表达式求值)
阅读量:4282 次
发布时间:2019-05-27

本文共 2878 字,大约阅读时间需要 9 分钟。

#include
#include
#define STACK_INIT_SIZE 50struct stack{ char *base; char *top; int stacksize;};void CreatStack(stack* S);char GetTop(stack* S, char* e);void Push(stack* S,char e);void Pop(stack* S, char &e);char Precede(char A1,char A2);//判断运算符栈(OPTR)栈顶A1与读入运算符A2的优先级char Operate(char a,char theta,char b);//用于读取a和b后进行theta运算bool OPTR(char c, char op[]);//运算符集合OPTR的判断 void CreatStack(stack* S){ S->base = (char *)malloc(sizeof(char)*(STACK_INIT_SIZE)); if(S->base == NULL){ printf("初始化栈失败\n"); return; } S->top = S->base; S->stacksize = STACK_INIT_SIZE; return ;}char GetTop(stack S,char* e){ if(S.base != NULL && S.top != NULL){ *e = *(S.top - 1); return *e; } else printf("取栈顶元素时出错\n");}void Push(stack* S, char e){ if(S->top - S->base >= S->stacksize){ S->base = (char *)realloc(S->base,(S->stacksize + STACK_INIT_SIZE)*sizeof(char)); if(!S->base){ printf("压栈时新建栈失败\n"); return; } S->top = S->base + S->stacksize; S->stacksize += STACK_INIT_SIZE; } *S->top++ = e; return ;}void Pop(stack *S, char *e){ if(S == NULL){ printf("弹栈时栈指针不存在\n"); return ; } if((S->base == NULL) || (S->top == NULL)){ printf("栈底或栈顶指针为空,出问题\n"); return; } *e = *(--S->top); return;}char Precede(char A1,char A2){ if(A1 == '+' || A1 == '-'){ if(A2 == '+' || A2 == '-' || A2 == ')' || A2 == '='){ return '>'; } else return '<'; } if(A1 == '*' || A1 == '/'){ if(A2 == '(') return '<'; else return '>'; } if(A1 == '('){ if(A2 == ')') return '='; } if(A2 == '=') return 'E'; else return '<'; if(A1 == ')'){ if(A2 == '('){ return 'E'; } if(A2 == '=') return 'E'; else return '>'; } if(A1 == '='){ if(A2 == '=') return '='; else return '<'; } else return '=';}char Operate(char a,char theta,char b){ switch(theta){ case'+': return a += b; break; case'-': return a -= b; break; case'*': return a *= b; break; case'/': if(b == 0){ printf("除数是0出错!\n"); return -1; } return a /= b; break; } return 0;}bool judge_OPTR(char c){ char op[7] = {'+','-','*','/','(',')','='}; for(int i = 0; i < 7; i++){ if(op[i] == c) return true; } return false;}int main(){ stack OPTR;//运算符栈 stack OPND; char end = '=';//结束标志 int i = 0; char e = 0,t = 0, c; CreatStack(&OPTR); Push(&OPTR,end); CreatStack(&OPND); c = (char)getchar(); while(c != '=' || GetTop(OPTR, &e) != '='){ if(!judge_OPTR(c)){ while(!judge_OPTR(c)){ t = t*10+(c-48); c = getchar(); } Push(&OPND,t); t = 0; } else{ switch(Precede(GetTop(OPTR, &e),c)){ case'<': Push(&OPTR,c); c = getchar(); break; case'=': char x; Pop(&OPTR,&x); c = getchar(); break; case'>': char b,theta,a; Pop(&OPTR,&theta); Pop(&OPND,&b); Pop(&OPND,&a); Push(&OPND,Operate(a,theta,b)); break; case'E': printf("括号不匹配\n"); break; } } } char tem = GetTop(OPND, &e); printf("总和为%d",tem); return 0;}

转载地址:http://ctfgi.baihongyu.com/

你可能感兴趣的文章
OK6410A 开发板 (八) 25 linux-5.11 OK6410A 进程角度 裸机和进程的区别
查看>>
OK6410A 开发板 (八) 26 linux-5.11 OK6410A 进程角度 idle进程的建立过程
查看>>
OK6410A 开发板 (八) 27 linux-5.11 OK6410A 进程角度 linux TCB 的分析
查看>>
OK6410A 开发板 (八) 28 linux-5.11 OK6410A 进程角度 fork的分析
查看>>
OK6410A 开发板 (八) 28 linux-5.11 OK6410A 进程之间的区别
查看>>
OK6410A 开发板 (八) 29 linux-5.11 OK6410A 主要内核线程解析
查看>>
OK6410A 开发板 (八) 30 linux-5.11 OK6410A 进程相关的寄存器
查看>>
OK6410A 开发板 (八) 31 linux-5.11 OK6410A 感知linux的内存管理
查看>>
OK6410A 开发板 (八) 32 linux-5.11 OK6410A 从内存角度简略分析整个启动过程
查看>>
OK6410A 开发板 (八) 33 linux-5.11 OK6410A 内存管理第一阶段
查看>>
OK6410A 开发板 (八) 34 linux-5.11 OK6410A 内存管理第二阶段
查看>>
OK6410A 开发板 (八) 35 linux-5.11 OK6410A 内存管理第三阶段
查看>>
OK6410A 开发板 (八) 36 linux-5.11 OK6410A 内存管理第四阶段
查看>>
OK6410A 开发板 (八) 37 linux-5.11 OK6410A 内存管理第五阶段
查看>>
OK6410A 开发板 (八) 38 linux-5.11 OK6410A 为什么需要这么多内存管理器
查看>>
OK6410A 开发板 (八) 39 linux-5.11 OK6410A memblock 的 alloc 和 free
查看>>
OK6410A 开发板 (八) 40 linux-5.11 OK6410A buddy 的 alloc 和 free
查看>>
OK6410A 开发板 (八) 41 linux-5.11 OK6410A slab 的 alloc 和 free
查看>>
OK6410A 开发板 (八) 42 linux-5.11 OK6410A vmalloc 的 alloc 和 free
查看>>
OK6410A 开发板 (八) 43 linux-5.11 OK6410A memblock 的 消费者
查看>>