递归经典表达式求值枚举#include stdio.h enum weekday { mon,tue ,wed ,thu ,fri.sat,sun //默认mon0 若mon1后面自动递增 }; int main() { enmu wekday a; amon; enum weekday b; btue; printf(%d\n,a); printf(%d\n,b); return 0; }用 typedef enum{mon1 ···}weekday ;直接用weekday 声明即可#include stdio.h typedef enum { mon1,tue,wed,thu,fri,sat,sun }weekday; typedef enum { false,true }bool; int main() { weekday a; amon; printf(%d\n,a); bool flagtrue; if(flag) { printf(真的\n); } }后缀表达式求值#include stdio.h #include stdlib.h #define MAXSIZE 100 typedef int ElemType; typedef struct { ElemType *data; int top; }Stack; typedef enum { LEFT_PARE,RIGHT_PARE,//分别代表 AND,SUB,MU,DIV,MOD, //-*/% EOS,NUM // \0 数字 }contentType; // 类型内容 char expr []82/256*-; //声明字符串类型的数组 //初始化 Stack* iniStack() { Stack *s(Stack*)malloc(sizeof(Stack); s-data(ElemType*)malloc(sizeof(ElemType); s-top-1; return s; } //判断栈是否为空 int isEmpty(Stack *s) { if(s-top-1) { printf(空的\n); return 1; } else { return 0; } } //进栈 int push(Stack *s,ElemType e) { if(s-topMAXSIZE-1) { printf( 满了 return 0; } s-top; s-data[s-top]e; return 1; } //出栈 int pop (Stack *s,ElemType *e) { if(s-top-1) { printf(空的 return 0; } *e s-data[s-top]; s-top--; return 1; } //获取栈顶元素 int getTop(Stack *s,ElemType *e) { if(s-top-1) { printf(空的 return 0; } *es-data[s-top]; return 1; } contentType getToken(char *symbool,int *index)//传入指针 { *symbolexpr[*index];//取字符串第index个位置 初始为1 *index*index1;//下标加1 switch(*symbol) { case(: return LEFT_PARE; case): return RIGHT_PARE; case: return ADD; case -: return SUB; case *: return MUL; case/: return DIV; case%: return MOD; case\0: return EOS; default: return NUM; } } int eval(Stack *s) { char symbol; int op1,op2; int index0;//索引下标 contentType token ; tokengetToken(symbol,index); ElemType result; while(token!EOS) { if(tokenNUM) //若为数字进栈 { push(s,symbol-0);栈的类型为int 把字符转换为int再进栈 } else //若为—*/ 进行运算 { pop(s,op2); pop(s,op1); switch(token) { case ADD: push(s,op1op2); break; case SUB: push(s,op1-op2); break; case MUL: push(s,op1*op2); break; case DIV: push(s,op1/op2); break; case MOD: push(s,op1%op2); break; default: break; } } token getToken(*symbol,index); } pop(s,result); printf(%d\n,result); retuen 1; } int main(){ Stack *sinitStack(); eval(s); return 0; }中缀表达式转后缀表达式#include stdio.h #include stdlib.h #define MAXSIZE 100 typedef int ElemType; typedef struct { ElemType *data; int top; }Stack; typedef enum { LEFT_PARE,RIGHT_PARE,//分别代表 AND,SUB,MU,DIV,MOD, //-*/% EOS,NUM // \0 数字 }contentType; // 类型内容 char expr []x/(i-j)*y; //声明字符串类型的数组 //初始化 Stack* iniStack() { Stack *s(Stack*)malloc(sizeof(Stack); s-data(ElemType*)malloc(sizeof(ElemType)*; s-top-1; return s; } //判断栈是否为空 int isEmpty(Stack *s) { if(s-top-1) { printf(空的\n); return 1; } else { return 0; } } //进栈 int push(Stack *s,ElemType e) { if(s-topMAXSIZE-1) { printf( 满了 return 0; } s-top; s-data[s-top]e; return 1; } //出栈 int pop (Stack *s,ElemType *e) { if(s-top-1) { printf(空的 return 0; } *e s-data[s-top]; s-top--; return 1; } //获取栈顶元素 int getTop(Stack *s,ElemType *e) { if(s-top-1) { printf(空的 return 0; } *es-data[s-top]; return 1; } contentType getToken(char *symbool,int *index)//传入指针 { *symbolexpr[*index];//取字符串第index个位置 初始为1 *index*index1;//下标加1 switch(*symbol) { case(: return LEFT_PARE; case): return RIGHT_PARE; case: return ADD; case -: return SUB; case *: return MUL; case/: return DIV; case%: return MOD; case\0: return EOS; default: return NUM; } } int eval(Stack *s) { char symbol; int op1,op2; int index0;//索引下标 contentType token ; tokengetToken(symbol,index); ElemType result; while(token!EOS) { if(tokenNUM) //若为数字进栈 { push(s,symbol-0);栈的类型为int 把字符转换为int再进栈 } else //若为—*/ 进行运算 { pop(s,op2); pop(s,op1); switch(token) { case ADD: push(s,op1op2); break; case SUB: push(s,op1-op2); break; case MUL: push(s,op1*op2); break; case DIV: push(s,op1/op2); break; case MOD: push(s,op1%op2); break; default: break; } } token getToken(*symbol,index); } pop(s,result); printf(%d\n,result); retuen 1; } int print_token(contentType token)//使输出变为符号不为数字 { switch(token) { case ADD: printf(): break; case SUB: printf(-): break; case MUL: printf(*): break; case DIV: printf(/): break; case MOD: printf(%): break; default: return 0; } return 1; } void postfix(Stack *s) { int in_stack[]{0,19,12,12,13,13,13,0}; //表示运算符优先级 int uot_stack[]{20,19,12,12,13,13,13,0}; contentType token; int index0; s-top0; //初始化 s[-data[0]EOS; char symbol; ElemType e; //每次出栈的内容 token getToken(symbol,index); while(token!EOS) { if(tokenNUM) //数字直接输出 { printf(%C,symbol); } else if(tokenRIGHR_PARE) //为右括号 { while(s-data[s-top]!LEFT_PARE)//不为 一直输出为则只出栈不输出 { pop(s,e); print_token(e); } pop(S,e); } else { while(in_stack[s-data[s-top]]out_stack[token]) //为运算符 判断优先级是否 { pop(s,e); print_token(e); //出栈输出 下一步把新的压进去 } push(s,token); } tokengetToken(symbol,index); } //把栈里的内容全部输出 pop(s,e); tokene; while(token!EOS) { print_token(token); pop(s,e); tokene; } printf(\n); } int main(){ Stack *sinitStack(); printf(%s\n,expr); postfix(s); return 0; }