数据结构与算法回炉重造 -- (四)

版权声明:本文为博主原创文章,未经博主允许可以转载。(转呀转呀/笑哭),希望标注出处hhh https://blog.csdn.net/qq_36428171/article/details/88413586

Stack 是一个后进先出的线性表,它要求只在表尾进行删除和插入操作。
简单理解:具有特殊限制的线性表,限制要求如上。
出栈:pop();
入栈:push();
清空栈:clear();

题目:利用栈的特点,将二进制装换为十进制数
例如二进制数:100110
将二进制数按位入栈

0
1
1
0
0
1

然后通过出栈操作进行计算转换

题目:利用栈的特点,将二进制转换为八进制
利用两个栈,一个栈存二进制数,另一个栈用做记录转换为八进制的数,按顺序弹出,得到转换的八进制。

栈的应用:
利用栈计算后缀表达式
如中缀表达式:1+(2-5)*6
如后缀表达式为:1 2 5 - 6 * +
声明栈A
将后缀表达式 数字依次入栈A,如果出现符号,则取出栈顶两个元素进行操作,再将结果入栈,直到后缀表达式遍历完成,弹出栈中的结果便是答案

出现符号"-" 出现符号"*" 出现符号"+" 遍历完成
5 6
2 -3 -3 -18 -18
1 1 1 1 1 -17

———>从左向右看,每一列为一个栈的状态
利用栈将中缀表达式转换为后缀表达式
1+(2-3)*4 + 10/5
从左到右遍历中缀表达式的每一个数字和符号,数字直接输出,如果是符号,需要判断其与栈顶书号的优先级,如果是右括号或者优先级低于栈顶符号,则栈顶元素依次出栈输出,直到遇到左括号,或者栈为空,再将判断的符号入栈。

将上面两点结合,就可以完成中缀表达式计算器
实现原理:
声明两个栈A,B,栈A进行计算后缀表达式,栈B进行中缀表达式的转换,中缀表达式转换过程中,将输出的数字和符号依次入栈A进行计算,如此可以得到结果。

队列

queue是只允许在一端进行插入操作,在另一端进行删除操作的线性表,具有先进先出的特性。
简单理解:食堂排队打饭

和栈相反,队列一般用链表来实现,栈一般用顺序表来实现。

队列如果用顺序存储:
每一次取队头,后面的每一个元素都需要向前移动,会增加耗时
如果增加一个灵活指针当队头,随着出队列,入队列操作增多,会有大部分空闲区域,同时可能会倒是数据溢出。
为解决上面的问题,可以通过循环队列解决
通过灵活改变头指针和尾指针 ,头指针和尾指针分别在出队和入队操作进行+1移位,同时用取模操作让,头尾指针不断循环,当头尾指针相等,便是队列已满或者队列已空

猜你喜欢

转载自blog.csdn.net/qq_36428171/article/details/88413586