程序员面试金典: 9.3栈与队列 3.3设计一个栈,栈到一定高度就会另外建栈。
2016-12-23 10:23
295 查看
#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 ; 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; }
相关文章推荐
- 程序员面试金典: 9.3栈与队列 3.2设计一个栈,除pop与push方法,支持返回栈最小元素min方法,时间复杂度均为O(1)
- 程序员面试金典: 9.3栈与队列 3.1描述如何只用一个数组来实现三个栈
- 程序员面试金典: 9.3栈与队列 3.5实现一个MyQueue类,该类用两个栈来实现一个队列
- 9.3栈和队列(三)——设计一个栈,出pop与push方法,还支持 min方法,可返回栈元素中的最小值
- 设计一个算法,找出二叉树中某两个结点的第一个公共祖先.。不得将额外的结点存储在另外的数据结构中。注意:这不一定是二叉查找树。
- 回到顶部,当页面下拉到一定高度时,就会出现回到顶部的按钮,点击回到顶部之后,会有一个速度的变化回滚到顶部,如果正在回到顶部时,鼠标的滚轮转动了就会停止回到顶部
- asp.net 后台弹框,过一定时间跳到另外一个页面
- 短信一次发送字节140个,如果超过140字节就会分为两条。这时如果第140个字节是中文的前半,那么第一条短信应该发送139字节。设计一个程序,读取原始信息,可以根据长度自动拆分信息转换为多条短信
- 当主线程队列,如果处理一个消息超过5秒,android 就会抛出一个 ANP(无响应)的消息
- 通过iframe引入另外一个项目中的html片段到项目中,解决样式,高度,兼容等问题的策略
- 50个jQuery 插件可将你的网站带到另外一个高度 - WEB开发者
- 50 个 jQuery 插件可将你的网站带到另外一个高度
- [编程之美]设计一个高效的数据结构,尽可能快的返回队列中的最大值
- 程序员面试金典(9)设计一个栈,返回最小值min
- 使用两个辅助的队列和非数组变量设计一个算法以使队列中的元素有序
- 50 个 jQuery 插件可将你的网站带到另外一个高度
- 关于ConcurrentQueue--一个队列缓存的设计
- 3.3课后第九题——设计一个个人纳税计算程序
- 设计技巧2:适配器模式 Adapter 将一个类的接口通过适配器转换成客户希望的另外一个接口
- Android是一个针对触摸屏专门设计的操作系统,当点击编辑框,系统自动为用户弹出软键盘,以便用户进行输入。 那么,弹出软键盘后必然会造成原有布局高度的减少,那么系统应该如何来处理布局的减少