栈 && 队列 && 堆

应用场景:
1)数制转换
2)括号匹配检验
3)迷宫求解
4)表达式求值 & 中缀表达式转后缀表达式
5)二叉树的非递归遍历

面试题
选择题:
1)一个栈的入栈列序是a,b,c,d,e,出栈的不可能的输出序列是( )
edcba
decba
dceab
Abcde
2)下列叙述中正确的是( )。
在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化
在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化
在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化
以上说法均不正确
3)表达式a*(b+c)-d的后缀表达式是()
abcd*±
abc+d-
abc
+d-
-+*abcd
4)若栈采用链式存储结构,则下列说法中正确的是()
需要判断栈满但不需要判断栈空
不需要判断栈满也不需要判断栈空
需要判断栈满且需要判断栈空
不需要判断栈满但需要判断栈空
5)若进栈序列为a,b,c,则通过入出栈操作可能得到的a,b,c的出栈的不同排列个数为( )
4
5
6
7
6)栈是先进后出的数据结构。给定一个大小为3的初始状态为空的栈,已知一组数据经过这个栈后,最终的数据顺序依次为:1 3 2 4 ,问原始的进栈数据不可能是以下的那组?
2 3 1 4
1 4 2 3
4 2 3 1
3 1 2 4
7)设栈S初始状态为空。元素a,b,c,d,e,f依次通过栈S,若出栈的顺序为c,f,e,d,b,a,则栈S的容量至少应该为?
3
4
5
6
8)下列叙述中正确的是( )
在循环队列中,队头指针和队尾指针的动态变化决定队列的长度
在循环队列中,队尾指针的动态变化决定队列的长度
在带链的队列中,队头指针与队尾指针的动态变化决定队列的长度
在带链的栈中,栈顶指针的动态变化决定栈中元素的个数

问答题:
1)实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1)
思路:
入栈,第一个元素入栈时(当前栈为空),push 两次第一个数据,第一次 push 的数据代表当前入栈的数据,第二次 push 的数据代表当前栈中最小的元素;第二个元素入栈时,先将该数据与当前栈顶的数据进行比较并记录下二者当中较小的数据,然后 push 第二个数据,接个 push 比较后记录的较小的那个数据(该数据就是当前栈中的最小值);后面入栈的数据做同样的处理
出栈,出栈时需 pop 两次,第一次 pop 的结果是当前栈中最小的元素,第二次 pop 的结果是真真意义上的栈顶元素
取最小值:当前栈顶的元素就是栈中所有元素的最小值

2)用两个栈实现队列
思路:
起初的时候,两个栈都为空,那么只要有元素来,那么默认插入到第一个栈。这是,如果要求删除一个元素,那么元素已经不在栈顶,在第一个栈中肯定无法直接删除了,此时我们发现第二个栈还没有派上用场,这里用到了,把第一个栈中的元素压入到第二个栈中,可以发现原来在第一个栈中栈底的元素已经出现在第二个栈的栈顶上,所以删除的功能就实现了。如果这个时候,“队列”里还有元素,我们还可以继续出队,而且,现在要出队的元素就在第二个栈的栈顶,所以直接出栈即可。如果栈2不为空,同时又需要出队,那么顺其自然直接弹出即可。如果栈2为空,那么从栈1中逐个弹出压入,那么完整的实现了先进先出的功能。

队列

应用场景:
1)消息队列

面试题
选择题:
1)以下哪一个不是队列的基本运算?( )
在队列第i个元素之后插入一个元素
从队头删除一个元素
断一个队列是否为空
读取队头元素的值
2)一个队列的入列序为 ABCD ,则队列的可能输出序列为( )
DCBA
ABCD
ADCB
CBDA
3)循环队列的存储空间为 Q(1:200) ,初始状态为 front=rear=200 。经过一系列正常的入队与退队操作后, front=rear=1 ,则循环队列中的元素个数为( )
0或200
1
2
199
4)设循环队列的结构是:
const int Maxsize=100;
typedef int Data Type;
typedef struct {
Data Type data[Maxsize];
int front, rear;
}Queue;
若 一个 Queue 类型的队列 Q ,试问判断队列满的条件应是下列哪一个语句
Q.frontQ.rear;
Q.front-Q.rear
Maxsize;
Q.front+Q.rear=Maxsize;
Q.front==(Q.rear+1)%Maxsize;
5)若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,re

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值