栈与队列及其C++实现

栈与队列及其C++实现

  • 栈及队列简介
    • 队列
  • 栈及队列的实现
    • 栈的实现
    • 队列的实现

栈及队列简介

栈是一种后进先出的数据结构即LIFO。
通常,插入操作在栈中被称作入栈,在栈的末尾添加一个新元素。删除操作被称作出栈,删除操作也发生在栈的末尾。即对于栈来说插入和删除操作均发生在栈的同一端。
如下图,在LIFO数据结构中,将首先处理添加到队列中的最新元素。
栈与队列及其C++实现_第1张图片
在C++ STL标准库中 头文件实现了栈。

队列

队列是一种先进先出的数据结构。
通常,插入操作被称为入队,新元素始终被添加在队列的末尾。删除操作也被称作出队,通常出队发生在对头,即只能移除目前的第一个元素。
如下图,在 FIFO 数据结构中,将首先处理添加到队列中的第一个元素。
栈与队列及其C++实现_第2张图片
在C++ STL标准库中 头文件实现了队列,头文件实现了双端队列(可以在两端扩展和收缩的连续容器)。

栈及队列的实现

栈的实现

#ifndef MYSTACK_H
#define MYSTACK_H
#include<vector>
#include<assert.h>
using namespace std;
template<typename T>
class mystack
{
public:
	//构造函数
	mystack() : data(NULL), count(0) {}
	mystack(int capacity)
	{
		data.reserve(capacity);
		count = 0;
	}
	//入栈
	void push(T data);
	//出栈
	void pop();
	//获取栈顶元素
	T top();
	//获取栈中数据容量
	int size();
	//判断栈是否为空
	bool empty();
private:
	vector<T> data;
	int count;
};
template<typename T>
void mystack<T>::push(T dt)
{
	data.push_back(dt);
	count++;
}
template<typename T>
void mystack<T>::pop()
{
	assert(count > 0);
	data.pop_back();
	count--;
}
template<typename T>
T mystack<T>::top()
{
	assert(count > 0);
	return data.back();
}
template<typename T>
int mystack<T>::size()
{
	return count;
}
template<typename T>
bool mystack<T>::empty()
{
	return count == 0;
}
#endif

队列的实现

循环队列的形式,当front==tail时判断队列为空,当(tail+1)% capacity == front时,判定队列为满不再执行添加元素(这种判定方式会导致有一个空间不能添加元素)。

#ifndef MYQUEUE_H
#define MYQUEUE_H
#include<vector>
#include<assert.h>
using namespace std;
template<typename T>
class myqueue
{
public:
    //构造函数(分配可以添加cap个元素的队列)
	myqueue(int cap)
	{
		data.resize(cap+1);
		front = 0;
		tail = 0;
		count = 0;
		capacity = cap + 1;
	}
	//入队
	void enqueue(T dt)
	{
		assert((tail + 1) % capacity != front);
		data[tail] = dt;
		tail = (tail + 1) % capacity;
		count++;
	}
	//出队
	T dequeue()
	{
		assert(tail != front);
		T tmp = data[front];
		data[front] = NULL;
		front = (front + 1) % capacity;
		count--;
		return tmp;
	}
	//获取队首元素
	T getfront()
	{
		assert(front != tail);
		return data[front];
	}
	//获取队列元素大小
	int size()
	{
		return count;
	}
	//判断队列是否为空
	bool empty()
	{
		return front == tail;
	}
private:
	vector<T> data;
	int front;
	int tail;
	int count;
	int capacity;
};
#endif

你可能感兴趣的:(数据结构与算法)