【C++】STL之stack/queue类源码剖析

目录

概述

源码

Stack.h

Queue.h

test.cpp


概述

stack与queue由严格的插入删除规则,stack元素只能先进后出,而queue元素只能先进先出,stack和queue都支持随机访问。

STL之中,stack和queue都可以通过双端队列deque适配器实现,大大简化了代码。

deque与vector类似,都采用动态内存管理,提供随机存取,并且与vector有着一样的接口,但是deque支持首位两端快速进行插入删除功能。

算法设计:通过类模板,在构造stack/queue时,在stack/queue内部默认构造一个deque,通过调用deque的接口实现stack/queue的功能。

源码

Stack.h

#pragma once

#include <deque>

template<class T, class Container = std::deque<int>>
class Stack
{
public:
	void push(const T& x)
	{
		_con.push_back(x);
	}

	void pop()
	{
		_con.pop_back();
	}

	const T& top()const
	{
		return _con.back();
	}

	bool empty()
	{
		return _con.empty();
	}

	size_t size()
	{
		return _con.size();
	}

private:
	Container _con;
};

Queue.h

#pragma once

#include <deque>

template<class T, class Container = std::deque<int>>
class Queue
{
public:
	void push(const T& x)
	{
		_con.push_back(x);
	}

	void pop()
	{
		_con.pop_front();
	}

	const T& front()
	{
		return _con.front();
	}

	bool empty()
	{
		return _con.empty();
	}

	size_t size()
	{
		return _con.size();
	}

private:
	Container _con;
};

test.cpp

#include "Stack.h"
#include "Queue.h"
#include <iostream>

void test_stack()
{
	Stack<int> s;
	s.push(1);
	s.push(2);
	s.push(3);
	s.push(4);
	while (!s.empty())
	{
		std::cout << s.top() << " ";
		s.pop();
	}
	std::cout << std::endl;
}

void test_queue()
{
	Queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);
	while (!q.empty())
	{
		std::cout << q.front() << " ";
		q.pop();
	}
	std::cout << std::endl;
}

int main()
{
	test_stack();
	test_queue();

	return 0;
}

猜你喜欢

转载自blog.csdn.net/phoenixFlyzzz/article/details/130435680