bc.c
来自「自己做的常用库和实现的数据结构。public domain.」· C语言 代码 · 共 144 行
C
144 行
/* parsing 1+2*3 */#include<stdio.h>#include<stdlib.h>#include<stddef.h>#define ADD 1#define MUL 2typedef struct opcode { char code; int pior; size_t sn; struct opcode *next;} OC;typedef struct oprand { int rand; size_t sn; struct oprand *next;} OR;typedef struct bracket { char brkt; int pior; size_t sn; struct bracket *next;} BK;int parse(const char *p){ size_t cnt1, cnt2; OC *cp; OR *rp; for(cnt1 = cnt2 = 1; *p; p++) { if(isdigit((int)*p)) { rp = add_to_oprand_link(*p, cnt); cnt1++; } else switch(*p) { case '+': case '-': cp = add_to_opcode_link(*p, cnt, ADD); cnt2++; break; case '*': case '/': cp = add_to_opcode_link(*p, cnt, MUL); cnt2++; break; } } return process(rp, cp);}OC *add_to_opcode_link(const char *p, size_t head_flag, int pior_flag){ OC *head, *t, *cp = (OC *)mem_apply(sizeof(OC)); cp->code = (int)(*p); cp->pior = pior_flag; cp->sn = head_flag; if(head_flag == 1) head = t = cp; else { t->next = cp; t = cp; } return head;}OR *add_to_oprand_link(const char *p, size_t head_flag){ OR *head, *t, *rp = (OR *)mem_apply(sizeof(OR)); rp->rand = (int)(*p); rp->sn = head_flag; if(head_flag == 1) head = t = rp; else { t->next = rp; t = rp; } return head;}int process(OR *rp_head, OC *cp_head){ OR *rp = rp_head; OC *cp = cp_head, *t2; int t = cp_head->pior; if(cp == NULL) return rp_head->rand; while(cp->next) { if(t < cp->next->pior) t = cp->next->pior; t2 = cp; cp = cp->next; }#if (t2->code == '+')#define OPCODE +#elif (t2->code == '-')#define OPCODE -#elif (t2->code == '*')#define OPCODE *#elif (t2->code == '/')#define OPCODE /#elif (t2->code == '%')#define OPCODE %#endif while(rp) { if(t == rp->sn) { rp->rand OPCODE= rp->next->rand; break; } rp = rp->next; } freerp(rp); freecp(t2);}const void freerp(OR *rp){ OR *t = rp->next; rp->next = t->next; free(t);}const void freecp(OC *cp){ OC *t = cp->next; if(cp == cp_head) { head = cp->next; free(cp); } cp->next = t->next; free(t);}const void freenode(OR *rp, OR *rp_head, OC *cp, OC *cp_head){ if(cp) { if(cp == cp_head) { t = cp->next; free(cp); } } }int main(){ char *a = "1 + 2*3"; printf("%d", parse); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?