c++实现基本栈和队列

栈和队列是最基本的数据结构,自己实现栈和队列可以更好帮助自己理解和使用c++标准库中为我们提供的栈和队列的操作


//栈---通过链表实现
template <class T>
struct Node
{
	T _value;
	Node<T>* _next;
	Node()
	{
		_next = NULL;

	}
	Node(T t)
	{
		_value = t;
		_next = NULL;
	}
};

template <class T>
class my_stack
{
	typedef Node<T> Node;
private:
	size_t cnts;//入栈数量
	Node* _head;
public:
	my_stack()
	{
		cnts = 0;
		_head = new Node();
	}
	//入栈
	void Push(T t)
	{
		Node *pnode = new Node(t);
		if(_head->_next==NULL)
		{
			_head->_next = pnode;
		}
		else
		{
			pnode->_next = _head->_next;
			_head->_next = pnode;
		}
		cnts++;
	}
	//出栈
	T Pop()
	{
		if(_head->_next!=NULL)
		{
			Node* tmp = _head->_next;
			_head->_next = _head->_next->_next;
			T a = tmp->_value;
			cnts--;
			delete tmp;
			return a;
			
		}
	}
	//返回栈顶元素
	T Top()
	{
		if(_head->_next!=NULL)
		{
			return _head->_next->_value;
		}
	}
	//打印栈
	void Print_Stack()
	{
		if(_head->_next!=NULL)
		{
			Node* tmp = _head;
			while(tmp->_next!=NULL)
			{
				tmp = tmp->_next;
				cout<<tmp->_value<<" ";
			}
		}
		cout<<endl;
	}
	//获取栈内元素个数
	size_t Size()
	{
		return cnts;
	}
	//判空
	bool Empty()
	{
		if(cnts)
		{
			return false;
		}
		return true;
	}
};

//队列---通过顺序表实现
#define DEFAULT_SZ 3

template <class T>
class my_queue
{
public:
	my_queue()
	{
		_array = (T*)malloc(sizeof(T)*(DEFAULT_SZ));
		_size = 0;
		_head = _array;
		_end = _array;
		_capacity = 3;

	}
	~my_queue()
	{
		free(_array);
		_array = NULL;
		_head = NULL;
		_end = NULL;
	}
	//在末尾加入一个元素
	void Push(T t)
	{
		CheckCapacity();
		_array[_size] = t;
		_end = _array+_size;
		_size++;
	}
	void CheckCapacity()
	{
		T* tmp = _array;
		if(_size==_capacity)
		{
			_array = (T*)realloc(_array,sizeof(T)*(_capacity+=DEFAULT_SZ));
			_capacity+=DEFAULT_SZ;
			if(_array == NULL)
			{
				_array = tmp;
			}

		}
	}
	//删除第一个元素
	void Pop()
	{
		if(_head!=NULL)
		{
			T* tmp = _head;
			_head ++;
			_size--;
		}
	}
	//返回第一个元素
	T Front()
	{
		if(_head!=NULL)
		{
			return *_head;
		}
	}
	//返回最后一个元素
	T Back()
	{
		if(_end!=NULL)
		{
			return *_end;
		}
	}
	//返回队列中元素的个数
	size_t Size()
	{
		return _size;
	}
	//如果队列空则返回真
	bool Empty()
	{
		if(_size)
		{
			return false;
		}
		return true;
	}
	void Print_Queue()
	{
		T* tmp = _head;
		while(tmp!=_end)
		{
			cout<<*tmp<<" ";
			tmp++;
		}
		cout<<*tmp<<" ";
		cout<<endl;
	}

private:
	T* _array;
	size_t _size;
	size_t _capacity;
	T* _head;
	T* _end;
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值