#include #include /*用于存储10个数字的英文表示,可以双向翻译*/char num[10][6] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };/*将输入英文单词翻译成数字*/int parse(char * input){ int i = 0; int match = 0; for (i = 0; i < 10; i++) { match = strcmp(input, num[i]); /*到字典里面检查是否和输入一致*/ if (match == 0) return i; /*如果一致返回字典索引,即翻译成功*/ } return -1;}/*由于人类书写习惯是数字高位在前,低位在后,所以用一个链表做的堆栈存储数字,以解决十进制数字位数问题*/struct TStack { int data; struct TStack * next;};/*这个全局变量用于实现堆栈*/struct TStack * root = 0;/*数字压栈*/void stack_push(int data){/*分配栈顶*/ struct TStack * x = (struct TStack *)malloc(sizeof(struct TStack));/*记录数据*/ x->data = data;/*压栈操作*/ x->next = root; root = x;}/*出栈操作,数据取出后以指针变量形式放到data中去,如果取出成功,返回1,返回值0表示到达栈底,无数据*/int stack_pop(int * data) { struct TStack * x = root; if (!x) return 0; root = x->next ; *data = x->data ; free(x); return 1;}/*利用堆栈求数据结果的程序*/int SumFromStack(void){/*x用于检查是否到达栈底,y用于读取堆栈数据, z用于进位处理, sum用于求得累加最终的和。tens数组用于表示当前数据的10进制幂*/ int x = 0, y = 0, z = 0, sum = 0; int tens[] = {1, 10, 100, 1000, 10000}; do { x = stack_pop(&y); /*从栈顶读取数据*/ if (x == 0) break; /*如果到达栈底表示计算完成,退出*/ sum += y * tens[z++]; /*栈顶读出数据后要乘以10进制幂,再累加到结果*/ }while(z < 5); /*最大计算到五位数*/ return sum; /*返回结果*/}/*同样以英文方式输出数据*/void print(int C){/*先将16进制整型数据转化为一个十进制字符串表达*/ char str[256]=""; size_t i = 0; sprintf(str, "%d", C);/*然后按照字符串求出当前位的值,再转回数据,根据数据到字典查询单词并输出*/ for (i = 0; i < strlen(str); i++) printf("%s ", num[str[i] - '0']); printf("\n");}int main(void){/*主程序,str用于读取字符串,AB用于存储数据,x用于分析字符串*/ char str[256] = ""; int A = 0, B = 0, x = 0; do { /*将所有变量,包括堆栈,置零*/ A = 0; B = 0; root = 0; x = 0; for(;;) { str[0] = 0; /*读取一个字符串进行判断*/ scanf("%s", str); x = parse(str);/*将英文单词转化成数据*/ if (x < 0 ) { /*如果不是英文单词而是符号*/ if (str[0] == '+') A = SumFromStack(); /*遇到加号表示A已经输入完毕,将A从堆栈中取出并计算*/ if (str[0] == '=') { /*如果遇到等号表示B已经输入完毕,从堆栈中取出并计算B,然后结束输入操作*/ B = SumFromStack(); break; } }else{ /*如果就是数据就将数据压入堆栈*/ stack_push(x); } } /*如果AB有一个非零则计算求和并打印英文结果*/ if (A || B) print(A + B); /*循环直到AB皆为0*/ }while(A || B);/*请按任意键结束程序*/ system("pause"); return 0; }