【程序员面试宝典】栈和队列相关面试题
2017-07-09 11:49
155 查看
1、集合栈
题目描述:
请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。
给定一个操作序列int[][2] ope(C++为vector<vector<int>>),每个操作的第一个数代表操作类型,若为1,则为push操作,后一个数为应push的数字;若为2,则为pop操作,后一个数无意义。请返回一个int[][](C++为vector<vector<int>>),为完成所有操作后的SetOfStacks,顺序应为从下到上,默认初始的SetOfStacks为空。保证数据合法。
问题分析:
(1)首先建立一个存放长度达到size的栈vec,用来存放长度达到size的栈(vector<vector<int>>);
(2)在创建一个temp栈用来操作当前要进行操作的数据(vector<int>);
(3)进来之后for循环遍历0~ope.size(),对于压栈的情况ope[i][0]==1,先判断栈temp栈中的元素是否达到size个,如果达到就将其先压入vec栈中,再清空temp栈,执行temp的压栈操作,否者直接将元素压入到temp当中;
(4)对于出栈时,首先判断temp栈是否为空,不为空则直接从temp中抛出元素,否则让temp指向vec栈的栈顶,然后让vec和temp都执行元素出栈动作。
(5)最后如果temp中的元素个数不为空,则将temp压入到vec当中,返回vec即可
代码实现
两个栈实现一个队列
3、双栈排序
题目描述:
请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。
给定一个int[] numbers(C++中为vector<int>),其中第一个元素为栈顶,请返回排序后的栈。请注意这是一个栈,意味着排序过程中你只能访问到第一个元素。
测试样例:[1,2,3,4,5]返回:[5,4,3,2,1]
问题分析:
(1)首先建立一个辅助栈temp,用来存放最终要返回的栈;
(2)将numbers的第一个元素push到辅助栈中,其后的过程就和插入排序的思路完全一样,只不过再此使用vector的接口来进行实现的;
(3)因为要对栈进行升序排序,所以若numbers[i]<temp.back()(小于栈顶)时,直接将其插入到后面,否则就需要在temp中遍历找合适的位置在插入。
(4)所有元素都操作完之后,返回最后排好序的temp栈即可
代码实现:
题目描述:
有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。
给定一个操作序列int[][2] ope(C++中为vector<vector<int>>)代表所有事件。若第一个元素为1,则代表有动物进入收容所,第二个元素为动物的编号,正数代表狗,负数代表猫;若第一个元素为2,则代表有人收养动物,第二个元素若为0,则采取第一种收养方式,若为1,则指定收养狗,若为-1则指定收养猫。请按顺序返回收养的序列。若出现不合法的操作,即没有可以符合领养要求的动物,则将这次领养操作忽略。
测试样例:[[1,1],[1,-1],[2,0],[2,-1]]返回:[1,-1]
问题分析:
(1)根据题目要求,这道题考查的是我们的逻辑思想,问题的描述已经十分清晰,相应的用代码实现出来即可;
(2)首先建立两个vector<int>的变量vec和arr,分别保存进入收容所中的动物和被领养的动物;
(3)接下来就是分情况,若ope[i][0]==1表示有动物进来,只需要不断的将其push到arr中,否则说明有动物将要被领养,对于要被领养的动物有三种情况。
(4)在arr栈不为空时,ope[i][1]==0,只需依次从arr中push,并将push后的数据从arr中erase掉,对于ope[i][1]==1/-1的情况,方法是一样的,需要遍历arr然后找到我们需要的元素,将其push到vec中,然后从arr中在erase掉。
(5)最后所有元素都处理完,只需要返回处理完后的res即可。
代码实现:
题目描述:
请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。
给定一个操作序列int[][2] ope(C++为vector<vector<int>>),每个操作的第一个数代表操作类型,若为1,则为push操作,后一个数为应push的数字;若为2,则为pop操作,后一个数无意义。请返回一个int[][](C++为vector<vector<int>>),为完成所有操作后的SetOfStacks,顺序应为从下到上,默认初始的SetOfStacks为空。保证数据合法。
问题分析:
(1)首先建立一个存放长度达到size的栈vec,用来存放长度达到size的栈(vector<vector<int>>);
(2)在创建一个temp栈用来操作当前要进行操作的数据(vector<int>);
(3)进来之后for循环遍历0~ope.size(),对于压栈的情况ope[i][0]==1,先判断栈temp栈中的元素是否达到size个,如果达到就将其先压入vec栈中,再清空temp栈,执行temp的压栈操作,否者直接将元素压入到temp当中;
(4)对于出栈时,首先判断temp栈是否为空,不为空则直接从temp中抛出元素,否则让temp指向vec栈的栈顶,然后让vec和temp都执行元素出栈动作。
(5)最后如果temp中的元素个数不为空,则将temp压入到vec当中,返回vec即可
代码实现
vector<vector<int> > setOfStacks(vector<vector<int> > ope, int size) { vector<vector<int> > stack; vector<int> temp; for (int i = 0; i<ope.size(); i++){ if (ope[i][0] == 1){ if (temp.size() == size){ stack.push_back(temp); temp.clear(); temp.push_back(ope[i][1]); } else temp.push_back(ope[i][1]); } if (ope[i][0] == 2){ if (temp.size()>0){ temp.pop_back(); } else{ temp = stack[stack.size() - 1]; temp.pop_back(); stack.pop_back(); } } } if (temp.size() != 0) stack.push_back(temp); return stack; }2、两个栈实现队列
两个栈实现一个队列
3、双栈排序
题目描述:
请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。
给定一个int[] numbers(C++中为vector<int>),其中第一个元素为栈顶,请返回排序后的栈。请注意这是一个栈,意味着排序过程中你只能访问到第一个元素。
测试样例:[1,2,3,4,5]返回:[5,4,3,2,1]
问题分析:
(1)首先建立一个辅助栈temp,用来存放最终要返回的栈;
(2)将numbers的第一个元素push到辅助栈中,其后的过程就和插入排序的思路完全一样,只不过再此使用vector的接口来进行实现的;
(3)因为要对栈进行升序排序,所以若numbers[i]<temp.back()(小于栈顶)时,直接将其插入到后面,否则就需要在temp中遍历找合适的位置在插入。
(4)所有元素都操作完之后,返回最后排好序的temp栈即可
代码实现:
vector<int> twoStacksSort(vector<int> numbers) { vector<int> temp; int size = numbers.size(); if (size <= 1) return numbers; temp.push_back(numbers[0]); for (int i = 1; i<size; ++i) { if (numbers[i] <= temp.back()) temp.push_back(numbers[i]); else { vector<int>::iterator it; for (it = temp.begin(); it != temp.end(); ++it) { if (*it<numbers[i]) break; } temp.insert(it, numbers[i]); } } return temp; }4、猫狗收容所
题目描述:
有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。
给定一个操作序列int[][2] ope(C++中为vector<vector<int>>)代表所有事件。若第一个元素为1,则代表有动物进入收容所,第二个元素为动物的编号,正数代表狗,负数代表猫;若第一个元素为2,则代表有人收养动物,第二个元素若为0,则采取第一种收养方式,若为1,则指定收养狗,若为-1则指定收养猫。请按顺序返回收养的序列。若出现不合法的操作,即没有可以符合领养要求的动物,则将这次领养操作忽略。
测试样例:[[1,1],[1,-1],[2,0],[2,-1]]返回:[1,-1]
问题分析:
(1)根据题目要求,这道题考查的是我们的逻辑思想,问题的描述已经十分清晰,相应的用代码实现出来即可;
(2)首先建立两个vector<int>的变量vec和arr,分别保存进入收容所中的动物和被领养的动物;
(3)接下来就是分情况,若ope[i][0]==1表示有动物进来,只需要不断的将其push到arr中,否则说明有动物将要被领养,对于要被领养的动物有三种情况。
(4)在arr栈不为空时,ope[i][1]==0,只需依次从arr中push,并将push后的数据从arr中erase掉,对于ope[i][1]==1/-1的情况,方法是一样的,需要遍历arr然后找到我们需要的元素,将其push到vec中,然后从arr中在erase掉。
(5)最后所有元素都处理完,只需要返回处理完后的res即可。
代码实现:
vector<int> asylum(vector<vector<int> > ope) { vector<int> res, arr; int size = ope.size(); if (ope.empty()) return arr; for (int i = 0; i < size; i++) { if (ope[i][0] == 1) { res.push_back(ope[i][1]); } else if (ope[i][0] == 2) { if (!arr.empty()) { if (ope[i][1] == 0) { res.push_back(arr[0]); arr.erase(arr.begin()); } else if (ope[i][1] == 1) { for (int j = 0; j < res.size(); j++) { if (arr[j]>0) { res.push_back(arr[j]); arr.erase(arr.begin() + j); break; } } } else if (ope[i][1] == 2) { for (int j = 0; j < res.size(); j++) { if (arr[j]>0) { res.push_back(arr[j]); arr.erase(arr.begin() + j); break; } } } } } return res; } }
相关文章推荐
- 栈和队列的相关面试题
- 【程序员面试宝典】链表相关面试题
- 栈和队列 相关 面试题
- 栈和队列 相关 面试题
- 栈和队列相关面试题
- 队列和栈相关面试题总结
- 栈和队列相关面试题2
- 栈和队列相关面试题(2)
- 栈和队列相关面试题(3)
- 栈和队列相关面试题(1)
- 栈和队列相关面试题(1)
- 【程序员面试宝典】字符串相关面试题
- 栈和队列的相关面试题
- 面试题7—相关题目(两个队列实现栈)
- 【程序员面试宝典】数组相关面试题
- 剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈
- 栈与队列相关面试题
- Android面试题-与XMPP相关试题一
- [分类整理III]微软等100题系列V0.1版之三:栈、堆、队列面试题集锦
- 《剑指offer》【面试题七:用两个栈实现队列】