栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

stack、queue及priority

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

stack、queue及priority

  • 主要学习的是容器适配器和仿函数,以及堆数据结构的回顾以及实践模拟

  • 容器适配器类似接口,实际上是一种设计模式,将已有的容器进行封装与改造,大大提高了复用性。

  • 仿函数是用起来像函数一样的类的方法,其重载了(),主要是用于简便函数指针的写法。用来代替>、<的比较。

  • 堆的具体内容实际上是C数据结构的内容,将在C的堆模拟中提及

  • deque的学习之后会进行

知道了stack,queue,priority_queue是适配器之后,比如说以后要想要知道queue里面的全部元素,可以自己封装好,实现自己想要的功能。(这点还是比较有用的)

  • my_stack.h
#pragma once
#include
namespace YCB {

	template >
	class stack
	{
	public:
		//默认构造函数会调用自定义类型的类的构造函数
		stack() {
							
		}
		void push(const T& x) {
			_con.push_back(x);
		}
		void pop() {
			_con.pop_back();
		}
		T& top() {
			return _con.back();
		}
		size_t size() {
			return _con.size();
		}
		bool empty() {
			return _con.empty();
		}
		//默认析构函数会调用自定义类型的类的析构函数
		~stack() {

		}

	private:
		Container _con;
	};

	void test_stack1() {
		stackst;
		st.push(1);
		st.push(2);
		st.push(3);
		st.push(4);
		cout << st.size() << endl;

		while (!st.empty()) {
			cout << st.top() << " ";
			st.pop();
		}cout << endl;

		cout << st.size() << endl;
	}
};

-my_queue.h

#pragma once
#include
namespace YCB {
	template >
	class queue
	{
	public:
		queue() {

		}
		void push(const T& x) {
			_con.push_back(x);
		}
		void pop() {
			_con.pop_front();
		}
		T& front() {
			return _con.front();
		}
		T& back() {
			return _con.back();
		}
		size_t size() {
			return _con.size();
		}
		bool empty() {
			return _con.empty();
		}
		~queue() {

		}

	private:
		Container _con;
	};

	void test_queue1() {
		queueque;
		que.push("zs");
		que.push("tu");
		que.push("@");
		que.push(".com");
		cout << que.size() << endl;
		cout << que.front() << endl;
		cout << que.back() << endl;
		while (!que.empty()) {
			cout << que.front() << endl;
			que.pop();
		}
		cout << que.size() << endl;;
	}
};
  • my_priority_queue
#pragma once

namespace YCB {
	//仿函数默认以less为大堆,greater为小堆
	//Node:C++中
	template
	struct less {
		bool operator()(const T& A, const T& B) const {
			return A > B;
		}
	};
	template
	struct greater {
		bool operator()(const T& A, const T& B) const {
			return A < B;
		}
	};
	//默认大堆
	template,typename Compare=less >
	class priority_queue
	{
	public:
		//typedef Container::value_type VT;
		//typedef typename Container::value_type VT;  需要指定typename告诉编译器实例化后再去找
		
		//向下调整
		void adjust_down(size_t parent) {
			Compare cmp;
			size_t child = parent * 2 + 1;
			size_t n = _con.size();
			while (child < n) {
				if(child+1 0) {
				size_t parent = (child - 1) / 2;
				if (!cmp(_con[parent], _con[child])) {
					std::swap(_con[parent], _con[child]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else break;
			}
		}

		//默认构造函数
		priority_queue() {

		}

		//
		template
		priority_queue(InputIterator first, InputIterator second) {
			while (first != second) {
				push(*first);
				first++;
			}
		}

		void push(const T& val) {
			_con.push_back(val);
			adjust_up(_con.size()-1);
		}
		void pop() {
			swap(_con[0], _con[(int)_con.size() - 1]);
			_con.pop_back();
			adjust_down(0);
		}

		void Print() {
			for (int i = 0; i < _con.size(); i++) {
				cout << _con[i] << " ";
			}cout << endl;
		}

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

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

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

		~priority_queue() {

		}

	private:
		Container _con;
	};


	void test_priority_queue1() {
		priority_queue que;
		que.push(3);
		que.push(5);
		que.push(1);
		que.push(8);
		que.push(9);
		que.push(10);
		que.push(4);
		que.push(13);

		que.Print();

		while (!que.empty()) {
			cout << que.top() << " ";
			que.pop();
		}cout << endl;
	}

	void test_priority_queue2() {
		priority_queue, greater >que;
		que.push(3);
		que.push(5);
		que.push(1);
		que.push(8);
		que.push(9);
		que.push(10);
		que.push(4);
		que.push(13);
		que.Print();

		while (!que.empty()) {
			cout << que.top() << " ";
			que.pop();
		}cout << endl;
	}

	void test_priority_queue3() {
		vectorv;
		v.push_back(3);
		v.push_back(5);
		v.push_back(1);
		v.push_back(8);
		v.push_back(9);
		v.push_back(10);
		v.push_back(4);
		v.push_back(13);
		priority_queue, greater >que(v.begin(), v.end());

		que.Print();
		while (!que.empty()) {
			cout << que.top() << " ";
			que.pop();
		}cout << endl;
	}
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/297319.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号