一个数组实现连个栈

基本思路:

两个栈共用一片空间,这就设计到怎么设计的问题,怎么可以合理的利用这片空间

(1)从中间往两边增加,这样不栈底的位置设计不合理,便会造成空间的浪费

(2)从两边往中间push(),可以合理的利用空间

(3)还可以按照数组下标的奇偶进行push(),同样这样但两个栈的大小差距太大的时候,也会造成较大的空间浪费

代码实现如下:(从两边向中间进行push)

函数声明:

template<class T>
class StaticOneArrayOfTwoStack
{
public:
	StaticOneArrayOfTwoStack(int size = 5);
	~StaticOneArrayOfTwoStack();
public:
	void Stack1Push(const T& x);
	void Stack2Push(const T& x);
	void Stack1Pop();
	void Stack2Pop();
	T& Stack1Top()const;
	T& Stack2Top()const;
	bool Stack1Empty()const;
	bool Stack2Empty()const;
	size_t Stack1Size()const;
	size_t Stack2Size()const;
protected:
	bool _IsFull();//每一个栈都会预留出一个的位置,要不然判断full太麻烦
//private:
public:
	T* _a;
	size_t _size;
	size_t _stack1TopIndex;
	size_t _stack2TopIndex;
	//size_t _stack1Begin;
	//size_t _stack2Begin;
	//size_t _stack1End;
	//size_t _stack2End;
};

具体实现:

template<class T>
StaticOneArrayOfTwoStack<T>::StaticOneArrayOfTwoStack(int size = 5)
	:_a(new int[size])
	, _size(size)
	, _stack1TopIndex(0)
	, _stack2TopIndex(size-1)
{}


template<class T>
StaticOneArrayOfTwoStack<T>::~StaticOneArrayOfTwoStack()
{
	if (_a != NULL)
	{
		delete[] _a;
	}
}


template<class T>
bool StaticOneArrayOfTwoStack<T>::_IsFull()
{
	return _stack2TopIndex - _stack1TopIndex==0;
}

template<class T>
void StaticOneArrayOfTwoStack<T>::Stack1Push(const T& x)
{
	if (_IsFull())
	{
		cout << "Stack1 if full" << endl;
		assert(false);
		return;
	}
	_a[_stack1TopIndex++] = x;
}

template<class T>
void StaticOneArrayOfTwoStack<T>::Stack1Pop()
{
	assert(_stack1TopIndex != 0);
	--_stack1TopIndex;
}

template<class T>
T& StaticOneArrayOfTwoStack<T>::Stack1Top()const
{
	assert(_stack1TopIndex != 0);
	return _a[_stack1TopIndex - 1];
}

template<class T>
bool  StaticOneArrayOfTwoStack<T>::Stack1Empty()const
{
	return _stack1TopIndex == 0;
}

template<class T>
size_t StaticOneArrayOfTwoStack<T>::Stack1Size()const
{
	return (_stack1TopIndex - 0);
}


//////////////////////////////////////
template<class T>
void StaticOneArrayOfTwoStack<T>::Stack2Push(const T& x)
{
	if (_IsFull())
	{
		cout << "Stack1 if full" << endl;
		assert(false);
	}
	_a[_stack2TopIndex--] = x;
}

template<class T>
void StaticOneArrayOfTwoStack<T>::Stack2Pop()
{
	assert(_stack2TopIndex != _size-1);
	++_stack2TopIndex;
}

template<class T>
T& StaticOneArrayOfTwoStack<T>::Stack2Top()const
{
	assert(_stack2TopIndex != _size-1);
	return _a[_stack2TopIndex + 1];
}

template<class T>
bool  StaticOneArrayOfTwoStack<T>::Stack2Empty()const
{
	return _stack2TopIndex == _size-1;
}

template<class T>
size_t StaticOneArrayOfTwoStack<T>::Stack2Size()const
{
	return (_stack2TopIndex - (_size-1));
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值