stack源码分析

本文详细分析了stack数据结构的特性,先进后出的原则以及在STL中作为container adapter的角色。stack不提供遍历功能和迭代器,只允许push和pop操作。此外,文中还提到了stack在实际中的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stack是一种先进后出的数据结构,只有一个出口,允许新增,移除,取得最顶端元素,但是
除了最顶端外,没有任何其他方法可以存取stack的其他元素.换言之,就是不允许有遍历行为
将元素推入stack的操作称为push,将元素推出stack的操作称为pop.
由于stack系一地步容器完成其所有工作,而具有这种修改某物接口,形成另一种风貌之性质者,称为adapter(配接器)
所以 STL stack往往不被归类为container(容器),而被归类为container adapter

//下面是stack的源码

template <class T,class Sequence=deque<T> >
class stack{
	//以下的__STL_NULL_TMPL_AGRS会展开为< >
friend bool operator ==__STL_NULL_TMPL_ARGS(const stack&,const stack&);
friend bool operator< __STL_NULL_TMPL_ARGS(const stack&,const stack&);
public:
	typedef typename Sequence::value_type value_type;
	typedef typename Sequence::size_type  size_type;
	typedef typename Sequence::reference reference;
	typedef typename Sequence::const_reference const_reference;
protected:
	Sequence c;//底层容器
public:
	//以下完全利用Sequence c的操作,完成stack的操作
	bool empty() const{return c.empty();}
	size_type size()const{return c.size();}
	reference top(){return c.back();}
	const_reference top()const{return c.back();}
	//deque是两头进出,stack是末端进.末端出
	void push(const value_type& x){c.push_back(x);}
	void pop(){c.pop_back();}

};
template <class T,class Sequence>
bool operator==(const stack<T,Sequence>&x,const stack<T,Sequence>&y)
{
	return x.c==y.c;
}
template <class T,class Sequence>
bool operator<(const stack<T,Sequence>&x,const stack<T,Sequence>&y)
{
	return x.c<y.c;
}

stack所有元素的进出都必须符合"先进后出"的条件,只有stack顶端的元素,才有机会被外界取用,stack不提供走访功能,也不提供迭代器
下面给出一个应用实例

/*
除了deque以外,list也是双向开口的数据结构.上述的stack源代码中使用的底层容器的函数有empty,size,back,push_back,pop_back.
凡此种种,list都具备.因此,若以list为底结构并封闭其头端开口,一样能够轻易形成一个stack,下面是做法示范
*/
#include<stack>
#include<list>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	stack<int,list<int> >istack;
	istack.push(1);
	istack.push(3);
	istack.push(5);
	istack.push(7);
	cout<<istack.size()<<endl;
	cout<<istack.top()<<endl;
	istack.pop(); cout<<istack.top()<<endl;
	istack.pop(); cout<<istack.top()<<endl;
	istack.pop(); cout<<istack.top()<<endl;
	cout<<istack.size()<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值