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

来源:互联网 发布:sql 查询表的约束 编辑:程序博客网 时间:2024/05/27 20:58
#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 13 51 2 3 4 51pop 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
原创粉丝点击