admin管理员组文章数量:1794759
进制转换的思路分析与计算器的实现
一、进制转换 思路
十进制转换为任何进制:
递归完毕后回溯第一次的值为最高位,而第一次调用时对应最低位。 根据这个特性,我们也可以模拟栈来存储进制转换过程的求余数据缓存,最后弹栈。将其他进制数转换为十进制数:(a为数值,B表示其进制)
数组中数组的高位在前,每for循环一次sum翻倍。首先从人性化的角度,表达 2*((1*3) + (4-2))对于我们来说很直观,因为我们可以跳过机械化的从数据的头一个一个符号看到尾,直接看优先级。对于计算机来说它就必须得从前到后依次分析符号的匹配以及优先级等等复杂规则。
1.栈模型实现计算机符号匹配原则: 遇到左符号入栈,其他普通字符则忽略,遇到右符号则弹栈,与该左符号匹配,直到栈中全部匹配完毕。
中缀表达式:符号我们使用和阅读的,“ 1 + 3”运算符位于中间。 (逆波兰)后缀表达式:符合计算机的。“ 1 3 +”将运算符符号放于数字后面。
中缀转后缀规则:例子: 8 + (3 - 1)* 5 ==> 8 3 1 - 5 * +
代码细节部分:符号在栈中进行压栈弹栈操作,而操作数则直接输出,逆波兰表达式中每个符号都要用空格隔开,避免操作数误解,例如8 3 1 - 5 * +,可被理解成 83 1 - 5 * +。 细节处理:
附上代码:tmp指向中缀表达式的字符串
void nibolan(char *s, char *tmp) { stack *st = NULL; st = stack_init(NUM); char *top = NULL; int ps = 0; int ptmp = 0; //中缀表达式遍历 while(s[ps] != 0){ //遇到数字直接输出 if( is_digital(s[ps]) ){ tmp[ptmp++] = s[ps++]; } //遇到左括号压栈 else if(s[ps] == '('){ stack_push(st, &s[ps++]); } //遇到运算符 else if( is_symbol(s[ps]) ){ if( stack_top(st) > 0){ while(1){ top = (char *)get_top(st); if(top == NULL) break; //与栈顶符号优先级比较 if( priority(s[ps]) < priority(*top) ){ stack_pop(st); tmp[ptmp++] = ' '; tmp[ptmp++] = *top; }else break; } } tmp[ptmp++] = ' '; stack_push(st, &s[ps++]); } //遇到右括号 else if( s[ps] == ')'){ while(1){ top = (char *)get_top(st); if(top == NULL) perr_exit("表达式有误,漏了左括号\\n"); else if(*top == '('){ stack_pop(st); ps++; break; } else{ stack_pop(st); tmp[ptmp++] = ' '; tmp[ptmp++] = *top; } } } } //中缀表达式遍历结束 while(1){ top = get_top(st); if(top == NULL) break; stack_pop(st); tmp[ptmp++] = ' '; tmp[ptmp++] = *top; } tmp[ptmp] = 0; } 计算机对后缀表达式的运算规则:代码细节部分:
附上代码:s指向后缀表达式的字符串
int deal_nbl(char *s) { int ret = 0; stack *st = NULL; st = stack_init(NUM); int R,L; char tmp[NUM][NUM] = {{0}}; int t[NUM] = {0}; int ptmp = 0; int pnum = 0; int ps = 0; //遍历逆波兰表达式 while(s[ps] != 0){ //每个操作数先经整形转换在入栈,空格为结束标志 if( is_digital(s[ps]) ){ while( 1 ){ tmp[pnum][ptmp++] = s[ps++]; if(s[ps] == ' '){ //tmp[pnum][ptmp] = 0; t[pnum] = atoi(tmp[pnum]); stack_push(st, &t[pnum]); pnum++; ptmp = 0; ps++; break; } } } else if( is_symbol(s[ps]) ){ R = *(int *)stack_pop(st); L = *(int *)stack_pop(st); ret = do_mul(s[ps], L, R); stack_push(st, &ret); ps += 2; } } ret = *(int *)stack_pop(st); return ret; } 2.二叉树实现计算机(优化)中序遍历可生成中缀表达式,后序遍历生成后缀表达式。 中缀表达式 1 + 2 * (66 / (2 * 3) + 7),后缀:1 2 66 2 3 * / 7 + * + 这里本人未作实验,大家可以动动手去试试。肯定比栈模型容易。
版权声明:本文标题:进制转换的思路分析与计算器的实现 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686579053a83946.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论