栈和队列题目

1. 设计含min函数的栈,要求min,push和pop时间复杂度都是O(1)。

设计一个辅助栈,存储当前栈中元素的最小值。

Push操作时,第一个元素不用比较,自动成为最小值入栈,其它元素每次都和栈顶元素比较,小的那个放到栈顶。注意:这里如果当前辅助栈顶元素小于新元素,则把辅助栈顶元素再入栈一次。Pop的时候,同时从原栈和辅助栈pop。所以,原栈和辅助栈大小相等。

2. 用两个栈实现队列

(1),stack1存的是每次进来的元素,所以Enqueue就是把进来的元素push到stack1中;

(2),对于Dequeue,一开始stack2为空,所以我们把stack1中的元素全部pop到stack2中,这样stack2的栈顶元素就是队头。只要stack2不为空,那么每次出队,就相当于stack2的pop;

(3),接下来,每一个元素入队时仍然push到stack1中。没出队一个元素,如果stack2不为空,就从stack2中pop一个元素,如果stack2为空,就重复上面的操作,即把stack1中元素全部pop到stack2中。

(4),Peek操作,类似于Dequeue,若stack2不空,则调用stack2的peek操作,若stack2为空,则把stack1中全部元素pop到stack2,并调用stack2的peek

(5),注意边界条件,只有stack1和stack2都为空,队列才为空。

3. 用两个队列实现栈

(1)所有数据都存在一个队列中

(2)在pop和peek时,将前n-1个元素出队,并入队到另一个队列,pop时,直接出队最后一个元素,peek时,出队最后一个元素,返回其值,并继续讲其入队到两一个队列。

(3)push时,将元素入队到不为空的那个队列。

感觉这样的实现没什么实际意义。

4. 栈的push,pop序列是否一致

输入两个整数序列,其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。简单起见,假设push序列的任意两个整数都是不相等的

比如输入的序列是1,2,3,4,5,那么4,5,3,2,1,就可能是一个pop序列。

解法:

  1. 把入栈序列入栈,直到栈顶元素等于出栈序列首元素;
  2. pop栈,出栈序列后移一个元素,并比较当前栈顶元素和出栈序列当前元素是否相等,若相等则继续2的操作;
  3. 若不相等,继续把入栈队列入栈,直到栈顶元素与出栈序列当前元素相等,并继续2的操作;
  4. 如果入栈队列一直入栈到最末尾尚未使得栈顶元素等于出栈序列当前元素,则说明不匹配。
5. 用一个数组实现两个栈

第一个栈,从左向右增长,第二个栈,从右向左增长,如果数组满,则将数组size变为原来两倍。

6. 用一个数组实现三个栈

一个从左到右,一个从右到左,第三个从中间(mid)开始,入栈规律可以如下:

  • 第一个入栈C的元素进mid处;
  • 第二个入栈C的元素进mid+1处;
  • 第三个入栈C的元素进mid-1处;
  • 第四个入栈C的元素进mid+2处。


### 回答1: 6。 因为S先入后出,而队列Q先入先出,根据出队序列e2,e4,e3,e6,e5,e1,可以得知元素e1最后出队,而元素e1是最先进入队列Q的,所以它最先进入S。同理,元素e2是最后进入队列Q的,所以它最后进入S。因此,S必须至少能够存储这6个元素,所以它的容量至少为6。 ### 回答2: S的容量至少应该是4。 根据题目描述,元素依次通过S,出后即入队列Q,而出队列的顺序是e2,e4,e3,e6,e5,e1。 我们可以模拟一下这个过程: 1. e1入S,此S有一个元素。 2. e2入S,此S有两个元素。 3. e2出S,e2入队列Q,此S有一个元素队列Q有一个元素。 4. e3入S,此S有两个元素。 5. e4入S,此S有三个元素。 6. e4出S,e4入队列Q,此S有两个元素队列Q有两个元素。 7. e3出S,e3入队列Q,此S有一个元素队列Q有三个元素。 8. e6入S,此S有两个元素。 9. e6出S,e6入队列Q,此S有一个元素队列Q有四个元素。 10. e5入S,此S有两个元素。 11. e5出S,e5入队列Q,此S有一个元素队列Q有五个元素。 12. e1出S,e1入队列Q,此S为空,队列Q有六个元素。 从上述模拟过程可得知,S的容量至少应该是4,以容纳元素e4、e3、e6和e5。 ### 回答3: 根据题意,元素依次通过S,出后即入队列Q。所以,在S,最后一个入元素会是出队列的第一个元素,即e1。 而给定的出队列的序列是e2,e4,e3,e6,e5,e1。所以,S在依次元素e1,e2,e3,e4,e5,e6后,出顺序应该是e6,e5,e4,e3,e2,e1。 假设S的容量 至少 为 n。由于是后进先出的数据结构,我们可以得到如下关系: 1. 入e1,顶为e1。 2. 入e2,顶为e2。 3. 入e3,顶为e3。 4. 入e4,顶为e4。 5. 入e5,顶为e5。 6. 入e6,顶为e6。 所以,S的容量至少应该是6。 答案为:S的容量至少应该是6。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值