1.介绍

在内存限制比较大的情况,我们需要用到栈结构。这时,要求栈的内存使用率要比普通的栈更高,该怎么办?

我们可以将两个栈合用一段连续的存储空间,如下图。

2.操作

(1)创建

开始创建时,初始化两个栈顶指针分别为-1和maxSize便于压栈函数统一。

template<typename T>
BdStack<T>::BdStack()
{
	maxSize = 10;
	top1 = -1;
	top2 = maxSize;
	data = new T[maxSize];
}

(2)判断栈满

由上图,我们可以发现当两个栈顶指针相邻,就说明栈已经满了。

template<typename T>
bool BdStack<T>::isFull()
{
	if (top2 - top1 == 1)
		return true;
	return false;
}

 (3)判空,这里我们需要分别判断。

template<typename T>
bool BdStack<T>::isEmpty1()
{
	if (top1 == -1)
		return true;
	return false;
}
template<typename T>
bool BdStack<T>::isEmpty2()
{
	if (top2 == maxSize)
		return true;
	return false;
}

(4)压栈

template<typename T>
bool BdStack<T>::push1(const T& val)
{
	if (isFull())
		return false;
	data[++top1] = val;
	return true;
}
template<typename T>
bool BdStack<T>::push2(const T& val)
{
	if (isFull())
		return false;
	data[--top2] = val;
	return true;
}

(5)退栈

template<typename T>
bool BdStack<T>::pop1()
{
	if (isEmpty1())
		return false;
	top1--;
	return true;
}
template<typename T>
bool BdStack<T>::pop2()
{
	if (isEmpty2())
		return false;
	top2++;
	return true;
}

 (6)查看栈顶元素

template<typename T>
const T& BdStack<T>::getTop1()
{
	if (isEmpty1())
		throw("error");
	return data[top1];
}
template<typename T>
const T& BdStack<T>::getTop2()
{
	if (isEmpty2())
		throw("error");
	return data[top2];
}

总的代码如下: 

#pragma once
template<typename T>
class BdStack
{
	T* data;
	int maxSize;
	int top1;
	int top2;
public:
	BdStack();
	~BdStack();
	void resize();
	bool isFull();
	bool isEmpty1();
	bool isEmpty2();
	bool push1(const T& val);
	bool push2(const T& val);
	bool pop1();
	bool pop2();
	const T& getTop1();
	const T& getTop2();
};
template<typename T>
void BdStack<T>::resize()
{
	T* p = data;
	data = new T[maxSize * 2];
	for (int i = 0; i < maxSize; i++)
		data[i] = p[i];
	maxSize *= 2;
	delete[]p;
}
template<typename T>
BdStack<T>::BdStack()
{
	maxSize = 10;
	top1 = -1;
	top2 = maxSize;
	data = new T[maxSize];
}
template<typename T>
BdStack<T>::~BdStack()
{
	delete[]data;
}
template<typename T>
bool BdStack<T>::isFull()
{
	if (top2 - top1 == 1)
		return true;
	return false;
}
template<typename T>
bool BdStack<T>::isEmpty1()
{
	if (top1 == -1)
		return true;
	return false;
}
template<typename T>
bool BdStack<T>::isEmpty2()
{
	if (top2 == maxSize)
		return true;
	return false;
}
template<typename T>
bool BdStack<T>::push1(const T& val)
{
	if (isFull())
		return false;
	data[++top1] = val;
	return true;
}
template<typename T>
bool BdStack<T>::push2(const T& val)
{
	if (isFull())
		return false;
	data[--top2] = val;
	return true;
}
template<typename T>
bool BdStack<T>::pop1()
{
	if (isEmpty1())
		return false;
	top1--;
	return true;
}
template<typename T>
bool BdStack<T>::pop2()
{
	if (isEmpty2())
		return false;
	top2++;
	return true;
}
template<typename T>
const T& BdStack<T>::getTop1()
{
	if (isEmpty1())
		throw("error");
	return data[top1];
}
template<typename T>
const T& BdStack<T>::getTop2()
{
	if (isEmpty2())
		throw("error");
	return data[top2];
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐