小白的数据结构与算法学习笔记(十二)----栈的应用

一、将二进制转换为十进制

基本公式:(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、输出结果

二、逆波兰计算器

扫描二维码关注公众号,回复: 2717546 查看本文章

例:(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

猜你喜欢

转载自blog.csdn.net/qq_41641805/article/details/81502806