本文共 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/