您的位置:首页 > 职场人生

程序员面试金典: 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐