题目
设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。数据结构SetOfStacks由多个栈组成,并且,在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同。
思路
利用STL,将一个stack对象视为一堆盘子,并创建一个存储变量类型为stack的vector,定义整形变量current,来记录当前堆的序号。注意在push函数中,当vector为空或stack为满时,需要新建stack;在pop函数中,需要特别注意当vector为空时的情况。网上大多是用Java实现,因个人用C++比较多,就用C++实现并测试了一下。如有纰漏,请不吝赐教。
题解
利用STL中的vector与stack实现。
#include <iostream>
#include <exception>
#include <stack>
#include <vector>
using namespace std;
class SetOfStacks
{
private:
vector<stack<int>> mystacks;
// 一堆中最多有maxSize个盘子
int maxSize;
// 记录当前的堆(stack)序号
int current;
public:
SetOfStacks(int n){ maxSize = n; current = 0; };
~SetOfStacks(){};
void push(int data)
{
// 如果当前没有任何盘子,则新建一个stack,将盘子放进去
if (mystacks.size() == 0)
{
stack<int> newStack;
mystacks.push_back(newStack);
mystacks[current].push(data);
}
// 如果当前stack满了,新建一个stack,将盘子放进去
else if (mystacks[current].size() == maxSize)
{
stack<int> newStack;
mystacks.push_back(newStack);
mystacks[++current].push(data);
}
// 如果当前stack没满,则继续在堆上放盘子
else if (mystacks[current].size() < maxSize)
{
mystacks[current].push(data);
}
}
void pop()
{
if (mystacks[current].size() > 0)
mystacks[current].pop();
else
{
// 所有盘子已被移走
if (current == 0)
throw exception("Stack has been empty!");
else
{
current--;
mystacks[current].pop();
}
}
}
int top()
{
return mystacks[current].top();
}
};
// 测试代码
int main()
{
// 一堆最多放三个盘子
SetOfStacks plates(3);
plates.push(1);
plates.push(2);
plates.push(3);
plates.push(4);
plates.push(5);
plates.push(6);
plates.pop();
// 返回当前堆中最上层的盘子序号
int topNum = plates.top();
// 运行结果 : topNum = 5
cout << topNum << endl;
return 0;
}感想
该题目让我对vector的了解和使用有了更深层次的理解。之前STL用的比较少,现在发现熟练应用STL可以大大加快编程的效率。所以这些天还是要多花点时间重新回顾并实践一下STL相关的知识。加油啦。