堆盘子问题(C++实现)

712 阅读2分钟

题目

设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。数据结构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相关的知识。加油啦。