程序员面试金典: 9.3栈与队列 3.3设计一个栈,栈到一定高度就会另外建栈。

#include <iostream>
#include <stdio.h>
#include <vector>
#include <stack>
#include <string>

using namespace std;


/*
问题:设想有一堆盘子,堆太高可能会到倒下来。因此,在现实生活中,盘子堆到一定高度时,就会
      另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。SetOfStacks应该由多个栈组成,
	  并且在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通
	  栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情况一样)。
分析:这个应该和之前的多个相同长度的栈时一样的。具体设定集合栈,设定每个栈的固定大小,超过后,
      使用新的栈,记录两个变量:当前栈下标和当前栈的大小

输入:
3(栈中最大元素数量) 5(所有栈的元素个数)
1 2 3 4 5(栈的元素)
1(操作栈的命令个数)
pop 1

3 5
1 2 3 4 5
1
pop 6
输出:
4(输出栈当前栈顶元素)
空栈

进阶:
实现一个popAt(int index)方法,根据指定的子栈,执行pop操作。
分析:
对指定子栈操作,该子栈可能在中间,那么指定子栈元素减少。
这个问题的本质是

关键:
1 无需记录当前栈下标和当前栈的大小,因为当前栈下标可以通过vector大小获取,当前栈大小通过stack大小获取
2 vector.back()获取最后一个元素vector.end()获取指向最后一个元素的迭代器
*/

class SetOfStacks
{
public:
	SetOfStacks(int maxSize)
	{
		maxStackSize = maxSize;
		stack<int> stackInt;
		stackSet.push_back(stackInt);
	}
	void push(int value)
	{
		//压入元素前先读取当前栈容量大小,如果没有超过容量,直接压入;否则,令开辟一个栈,存放在新栈中
		int size = stackSet.back().size();
		if(size + 1 <= maxStackSize)
		{
			stackSet.back().push(value);
		}
		//相加后超过栈大小,必须新建一个栈
		else
		{
			stack<int> stackInt;
			stackInt.push(value);
			stackSet.push_back(stackInt);
		}
	}

	//弹出元素,如果当前栈个数-1 >= 0 ,那么直接弹出元素;否则,令当前栈下标减1,并从栈集合中移除当前栈
	void pop()
	{
		//如果栈空,直接返回
		if(isEmpty())
		{
			return;
		}
		int size = stackSet.back().size();
		if( size > 1)
		{
			stackSet.back().pop();
		}
		else
		{
			//还有栈,需要将之前的栈移除
			stackSet.pop_back();
		}
	}

	bool isEmpty()
	{
		if( stackSet.empty() )
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	int top()
	{
		if ( !isEmpty() )
		{
			int value = stackSet.back().top();
			cout << value << endl;
			return value;
		}
		else
		{
			cout << "空栈" << endl;
			return -1;
		}
	}
private:
	int maxStackSize;
	vector< stack<int> > stackSet;
};

int main(int argc, char* argv[])
{
	int maxStackSize , n;
	while(cin >> maxStackSize >> n)
	{
		SetOfStacks setOfStacks(maxStackSize);
		int* pArr = new int[n];
		for(int i = 0 ; i < n ; i++)
		{
			cin >> *(pArr + i) ;
			setOfStacks.push( *(pArr+i) );
		}
		//输入完栈元素后,根据指令进行操作
		int commandNum;
		cin >> commandNum;
		string command;
		int value;
		for(int j = 0 ; j < commandNum ; j++)
		{
			cin >> command >> value;
			if( command == "pop")
			{
				for(int k = 0 ; k < value ; k++ )
				{
					setOfStacks.pop();
				}
			}
			else if( command == "push")
			{
				setOfStacks.push(value);
			}
		}
		setOfStacks.top();
		delete[] pArr;
	}
	getchar();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值