Vulkan

Cracking The Coding Interview3.3

//Imagine a (literal) stack of plates. If the stack gets too high, it might topple. Therefore, in real life, we would likely start a new stack when the previous stack exceeds some threshold. Implement a data structure SetOfStacks that mimics this. SetOfStacks should be composed of several stacks, and should create a new stack once the previous one exceeds capacity. SetOfStacks.push() and SetOfStacks.pop() should behave identically to a single stack (that is, pop() should return the same values as it would if there were just a single stack).
//
//	FOLLOW UP
//
//	Implement a function popAt(int index) which performs a pop operation on a specific sub-stack.
//

//#include "mStack.h"
#include "MyStack.h"
struct stackPoint
{
	MyStack *currentStack;
	stackPoint *nextStackPoint;
};

class SetOfStacks
{
public:
	SetOfStacks()
	{
		sp = new stackPoint;
		sp->currentStack = new MyStack;
		sp->nextStackPoint = NULL;
		numOfStack = 1;
	}

	bool push(int e)
	{
		if (sp->currentStack->isFull())
		{
			
			stackPoint *t = new stackPoint;
			t->currentStack = new MyStack;
			t->currentStack->push(e);

			t->nextStackPoint = sp;
			sp = t;
			numOfStack ++;
		}
		else
		{
			sp->currentStack->push(e);
		}
		return true;
	}

	int pop()
	{
		if (sp->currentStack->isEmpty())
		{
			stackPoint *t =sp;
			sp = sp->nextStackPoint;
			delete t;
			numOfStack --;
			return sp->currentStack->pop();
		}
		else
		{
			return sp->currentStack->pop();
		}
	}

	int popAt(int index)
	{
		int ind = numOfStack - index;
		if (ind <0)
		{
			return -9999;
		}

		stackPoint *t = sp;
		while(ind>0)
		{
			ind--;
			t=t->nextStackPoint;
		}
		return t->currentStack->pop();
	}

	int getNumOfStack()
	{
		return numOfStack;
	}

private:
	stackPoint *sp;
	int numOfStack;
};

int main()
{
	SetOfStacks s;
	
	for (int i = 0;i<100;i++)
	{
		s.push(i+1);
	}
	cout<<"numOfStack "<<s.getNumOfStack();
	cout<<endl;
	for (int i=0;i<50; i++)
	{
		cout<<s.pop()<<endl;
	}
	cout<<"numOfStack "<<s.getNumOfStack()<<endl;
	cout<<"PoPat "<<s.popAt(1)<<endl;
	return 0;
}

上例子中,popAt()没有把pop位置后面的数据前移。用到的MyStack对stack简单封装了一下,如下,

#include <iostream>
#include <stack>
#define MAXSIZE 20
using namespace std;
class MyStack
{
public:
	stack<int> mstack;
	void push(int e)
	{
		mstack.push(e);
	}
	int pop()
	{
		if (!mstack.empty())
		{
			int k=mstack.top();
			mstack.pop();
			return k;
		}
		return -1;
		
	}
	bool isFull()
	{
		if (mstack.size()>MAXSIZE-1)
		{
			return true;
		}
		else
			return false;
	}
	bool isEmpty()
	{
		return mstack.empty();
	}
};


posted on 2014-04-10 15:17  Vulkan  阅读(136)  评论(0编辑  收藏  举报

导航