封装一个栈,队列

一、栈:

特殊的线性表,只能在其一端进行数据插入和删除操作,

特性:先进后出 FIFO

2、模拟实现一个栈

# include<stdio.h>
# include<stdlib.h>
# include<assert.h>
# include<string.h>
# include<iostream>
//引用前面自己实现的顺序表的类的头文件
using namespace std;

//template<class T,class Container=Vector<T>>
//class T:容器类型   class Conainer:底层空间,此时Container若是想要给定
//一个默认的参数,必须实例化的时候需要给定一个具体的类型,不能直接给一个
//Vector,因为Vector是一个模板类,不是具体的类型,此时只能给成Vector<T>
template<class>
class Container
{};//模板类的名字
//template<class T, template<class T> class Container>
template<class T,template<class> class Container=Vector>
//第二个模板参数:模板类。
//template<class> class Container:模板的模板参数:模板类的参数列表<class>,不需要给出模板类的名字,此时
//是一个模板的类型而不是模板类,此时的Vector也是模板类,此时两个模板类(Container和Vector)的参数个数也应该相同
//Container是一个模板类,只接收一个模板类的参数,而且不用把这个参数给出来
//若是此处给定模板的模板类函数<class T>,则后面实例化为对象,也必须给定模板类函数Container<T>
class Stack
{
public:
	//给定构造函数
	Stack()
	{}
	void Push(const T& data)
	{
		_con.PushBack(data);
	}
	void Pop()
	{
		_con.PopBack();
	}
	T& Top()
	{
		return _con.Back();
	}
	const T& Top()const
	{
		return _con.Back();
	}
	size_t Size()const
	{
		return _con.Size();
	}

private:
	Container _con;//创建一个容器的对象//Container是一个具体的类型
	//Container<T> _con;//Container是一个模板类
};
void Test()
{
	Stack<int> s;
	s.Push(1);
	s.Push(2);
	s.Push(3);
	s.Push(4);
	s.Push(5);
	cout << s.Size() << endl;
	cout << s.Top() << endl;
	s.Pop();
	s.Pop();
	cout << s.Size() << endl;
	cout << s.Top() << endl;
}
int main()
{

}

二、模拟实现一个队列

队列是一个特殊的线性结构:只有两种操作:在一端进行数据的插入(队尾),在另一端进行数据的删除操作(队头)

从队头出队列,从队尾入队列

2、封装一个队列

使用模板函数封装一个队列

# include<stdio.h>
# include<stdlib.h>
# include<assert.h>
# include<string.h>
# include<iostream>
using namespace std;
//使用模板参数来实现一个队列
template<class T,class Container=List<T>>
//依靠底层封装的List顺序表,重新封装一个
class Queue
{
public:
	//给出空间
	Queue()
	{}
	void Push(const T& data)
	{
		_con.PushBack(data);
	}
	void Pop()
	{
		_con.PopFront();
	}
	T& Front()
	{
		return _con.Front();
	}
	const T& Front()const
	{
		return _con.Front();
	}
	T& Back()
	{
		return _con.Back();
	}
	const T& Back()const
	{
		return _con.Back();
	}
	size_t Size()const
	{
		return _con.Size();
	}
	bool Empty()const
	{
		return _con.Empty();
	}
private:
        Container _con;
};
void Test()
{
    Queue<int> q;
    q.Push(1);
    q.Push(2);
    q.Push(3);
    q.Push(4);
    q.Push(5);
    cout<<q.Front()<<endl;
    cout<<q.Back()<<endl;
    cout<<q.Size()<<endl;
    q.Pop();
    q.Pop();
    q.Pop();
    cout<<q.Front()<<endl;
    cout<<q.Back()<<endl;
    cout<<q.Size()<<endl;
}
int main()
{
    Test();
    return 0;
}

3、使用模板的模板参数来封装

# include<stdio.h>
# include<stdlib.h>
# include<assert.h>
# include<string.h>
# include<iostream>
using namespace std;
template<class T, template<class> class Container = List>
//如果带有缺省值也必须为一个模板,"List"
class Queue
{
public:
	//给出空间
	Queue()
	{}
	void Push(const T& data)
	{
		_con.PushBack(data);
	}
	void Pop()
	{
		_con.PopFront();
	}
	T& Front()
	{
		return _con.Front();
	}
	const T& Front()const
	{
		return _con.Front();
	}
	T& Back()
	{
		return _con.Back();
	}
	const T& Back()const
	{
		return _con.Back();
	}
	size_t Size()const
	{
		return _con.Size();
	}
	bool Empty()const
	{
		return _con.Empty();
	}
private:
	Container<T> _con;//通过具体的类型定义一个容器
};
void Test()
{
	Queue<int> q;
	q.Push(1);
	q.Push(2);
	q.Push(3);
	q.Push(4);
	q.Push(5);
	cout << q.Front() << endl;
	cout << q.Back() << endl;
	cout << q.Size() << endl;
	q.Pop();
	q.Pop();
	q.Pop();
	cout << q.Front() << endl;
	cout << q.Back() << endl;
	cout << q.Size() << endl;
}
int main()
{
	Test();
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuruhua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值