🤔stack容器介绍:
📖 stack是一种数据结构,也可以被称为堆栈。它是一个容器,只允许在最顶层进行插入和删除,并且只能访问最后一个插入的元素。这个元素称为栈顶。所有新插入的元素都被放置在栈顶上面,当删除元素时,它们从栈顶开始向下移动,同时也随之被删除。由于stack只允许在顶部进行操作,因此它是一个后进先出的数据结构(LIFO)。
🤔stack容器特点:
📖1.只有栈顶元素可以被访问和操作,其他元素都不能被直接访问。
📖2.插入和删除操作的时间复杂度是O(1),非常高效。
📖3.可以使用top()函数访问或者修改栈顶元素。
📖4.可以使用empty()函数判断栈是否为空,size()函数获得栈的大小。
📖 5.可以使用pop()函数删除栈顶元素。
🤔stack容器图解:
🤔stack成员函数:
📖*由于stack独特的数据结构,stack容器提供的函数较少。
🔍stack构造函数:
📖1.默认构造:stack <T> name;
stack<int> d1;
📖2.拷贝构造函数:stack(const stack &stk);
stack<int> d2(d1);
🔍stack赋值函数:
📖1.重载等号运算符:stack &operator=(const stack &stk);
stack<int> d2(d1);
d2 = d1;
🔍stack数据存取函数:
📖1.向栈顶添加一个元素:push(ele);
d1.push(i);
📖2.从栈顶移除一个元素:pop();
d.pop();
📖3.返回栈顶元素:top();
d.top
🔍stack判断函数:
📖1.判断是否为空:empty();
d.empty()
📖2.返回栈的大小:size();
d.size()
📖3.清空栈:clear();
d.clear();
4.交换两个栈:swap();
d.swap(d1);
代码实例:
#include<iostream>
using namespace std;
#include<stack>
void print(stack<int>& d)
{
cout << endl;
cout << "最开始栈大小为:";
cout << d.size() << endl;
//利用判断这个栈是否为空来循环弹出所有的栈顶元素
while (!d.empty())
{
//弹出栈顶数据
cout << d.top() << " ";
//删除当前栈顶元素
d.pop();
}
cout << "此时栈大小为:";
cout << d.size() << endl;
cout << endl;
}
void test01()
{
//默认构造
stack<int> d1;
for (int i = 0; i < 9; i++)
{
//入栈
d1.push(i);
}
cout << "默认构造结果为:";
print(d1);
//重新入栈,因为第一次打印之后栈已经为空
for (int i = 0; i < 9; i++)
{
d1.push(i);
}
//拷贝构造
stack<int> d2(d1);
cout << "拷贝构造结果为:";
print(d2);
//重载等号运算符
stack<int> d3(d1);
d3 = d1;
cout << "重载运算符:";
print(d3);
}
int main()
{
test01();
}
运行结果:
🤔stack实际应用场景
📖1.表达式求值:stack容器可以用于中缀表达式转换为后缀表达式的计算中,利用栈的后进先出特性和运算符的优先级可以对后缀表达式进行求值。
📖2.编辑器撤销和重做功能:可以使用两个stack容器,一个保存撤销的动作,一个保存重做的动作。
📖3.函数调用栈:当函数调用时,程序会把当前函数的调用栈信息压入栈中,当函数返回时,程序会从栈中弹出该函数的调用栈信息,实现函数调用的嵌套。
📖4.括号匹配:使用一个栈容器可以很容易地判断一个表达式中的括号是否匹配,如果左括号就入栈,如果右括号就出栈,最后栈中为空则说明左右括号匹配。
📖5.内存分配:栈容器也可以用于内存分配,因为栈会按照LIFO的原则对元素进行管理,可以方便地控制内存分配和释放,适合于需要严格控制内存使用和回收的场合。