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 + -
显示快捷键?