STL之stack

写在前面

栈(stack)又名堆栈, 它是一种运算受限制的线性表. 其限制是仅允许在表的一端进行插入和删除运算, 这一端称为栈顶, 相对的, 把另一端称为栈底.

向一个栈插入新元素称作进栈, 入栈或压栈, 它是把元素放在栈顶元素上面, 成为新的栈顶元素.

从一个栈删除元素又称为出栈或退栈, 它是删除栈顶元素, 使其相邻元素成为栈顶元素.

使用STL中的stack, 需导入头文件.

#include 
using namesapce std;

构造

stack没有像string, vector等过多的带参构造, 且只显式的initializer_list列表初始化.

	stack<int> st{ 1, 2, 3 };			//错误
	stack<int> st1 = { 1, 2, 3 };		//错误
	stack<int> st2(initializer_list<int>{ 1, 2, 3 });	//正确, 这里会

常用的一些构造

	stack<int> st;			//构造一个空的堆栈
	stack<int> st1(st);		//拷贝构造
	
	deque<int> dq{ 1, 2, 3 };
	stack<int> st2(dq);		//虽然stack只支持显式的列表初始化对象, 但可以通过支持列表初始化的deque对象初始化stack

赋值

重载的赋值运算符=.

	deque<int> dq{ 1, 2, 3 };
	stack<int> st(dq);

	stack<int> st2 = st;	//注意这里会调用的是赋值构造, 因为st2没有初始化, 即stack(const T& right);

	stack<int> st3;
	st3 = st1;		//这样才是赋值操作, 因为st3已经初始化为一个空的stack

大小操作

size成员函数

	deque<int> dq{ 1, 2, 3 };
	stack<int> st(dq);
	
	stack<int>::size_type nSize = st.size();	

empty成员函数

	deque<int> dq{ 1, 2, 3 };
	stack<int> st(dq);

	if (st.empty())
	{
		//空栈
	}
	else
	{
		//非空
	}

插入删除

stack只允许在栈顶进行插入删除操作.

push成员函数

堆栈顶部是最近添加的元素所占据的位置,并且是容器末尾处的最后一个元素。

	stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);

pop成员函数

堆栈必须为非空才能应用成员函数。 堆栈顶部是最近添加的元素所占据的位置,并且是容器末尾处的最后一个元素。

	stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);
	
	for (int i = 0; i < st.size(); i++)
	{
		st.pop();
	}

访问

stack只允许在栈顶操作, 因此不提供随机访问.

top成员函数

非空堆栈顶部容器中的最后一个元素的引用, 并且不会移除该栈顶元素。

	stack<int> st(deque<int>{ 1, 2, 3 });
	stack<int>::size_type nSize = st.size();
	for (int i = 0; i < nSize; i++)
	{
		cout << st2.top() << endl;
		st2.pop();
	}
	

	//注意不能这样
	for (int i = 0; i < st2.size(); i++)
	{
		cout << st2.top() << endl;
		st2.pop();
	}

	//但是可以这样
	while (st.size() > 0)
	{
		cout << st.top() << endl;
		st.pop();
	}

	//不支持范围for循环
	for (auto nVal : st)
	{
		cout << st.top() << endl;
	}

	//没有迭代器操作

你可能感兴趣的:(STL,C++,c++,开发语言,数据结构)