1、集合栈
题目描述:
请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。
给定一个操作序列int[][2] ope(C++为vector
问题分析:
(1)首先建立一个存放长度达到size的栈vec,用来存放长度达到size的栈(vector
(2)在创建一个temp栈用来操作当前要进行操作的数据(vector
(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 > setOfStacks(vector > ope, int size) {
vector > stack;
vector temp;
for (int i = 0; i0){
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
vector twoStacksSort(vector numbers) {
vector temp;
int size = numbers.size();
if (size <= 1)
return numbers;
temp.push_back(numbers[0]);
for (int i = 1; i::iterator it;
for (it = temp.begin(); it != temp.end(); ++it)
{
if (*it
4、猫狗收容所
有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。
给定一个操作序列int[][2] ope(C++中为vector
vector asylum(vector > ope)
{
vector 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;
}
}