一、将二进制转换为十进制
基本公式:(XnXn-1······X3X2X1)2=X1*2^0+X2*2^1+·····+Xn*2^(n-1)
过程:
1、初始化栈:s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
2、二进制数入栈:这里入栈类型为char,不可为int!!
3、转化:通过循环叠加,但这里注意二进制每一位的存储形式是ASCII,所以应该:sum+=(c-48)*pow(2,i)
4、输出结果
二、逆波兰计算器
例:(1-2)*(4+5)用逆波兰表示法是:1 2 - 4 5 + *
数字1,2进栈,遇到减号运算符则弹出两个元素进行运算并把结果-1入栈;数字4,5入栈,遇到加号运算符,弹出4,5相加,将结果9入栈;遇到乘法运算符,-1,9出栈,得结果-9
过程:
1、初始化栈:s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
2、设置缓冲区,存放输入的数据,如:3.1415
3、利用switch分别处理“+”,“-”,”*“,”/“。(两个数据出栈,计算后,再将结果入栈)
4、输出结果
三、中缀表达式转换成后缀表达式
例:中缀表达式就是1+(2-3)*4+6/3;后缀表达式就是1 2 3 - 4 * 6 3 / + 。
数字1直接输出,”+“入栈,”(“入栈,数字2输出,”-“入栈,数字3输出,遇到“)“,开始出栈,”-“出栈,遇到”(“,停止出栈,”*“入栈,数字4输出,遇到”+“,栈顶此时是”*“,优先级比”+“高,所以出栈,栈里面的”+“先进栈,所以也出栈,栈外面的”+“进栈,数字6输出,”/“进栈,数字3输出,栈中其余元素依次出栈。
注意:
1、栈只装符号,不装数字,数字都是直接输出
2、当栈顶符号优先级高于或等于即将进栈的符号,则出栈。“(”没有优先级可言!
3、当”)”入栈,则将栈顶到“(”之间的符号全部出栈。
4、ElemType此时是char型,而非double型!
过程:
1、初始化栈:s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
2、对每个字符进行判断:
如果是数字:直接输出
如果是“)”:遍历出栈直至找到“(”
如果是“*”或“/”或“(”:直接入栈
如果是“+”或“-”:如果栈为空,则直接入栈;如果栈非空,栈顶优先级一定大于或等于即将入栈符号,开始出栈,直至栈空或找 到“(”
3、输出结果
BY ZJQ