moc 发表于 2018-9-19 19:22:52

047-C++之STL-->stack

1、stack简介
stack是栈容器,是一种“先进后出”的容器。
stack是简单的修饰deque容器而成的另外一种容器。
为了严格遵循堆栈的数据后进先出原则,stack 不提供元素的任何迭代器操作,因此,stack 容器也就不会向外部提供可用的前向或反向迭代器类型。
2、stack操作
1.构造函数
默认构造函数创建空栈。stack<int> s1;
拷贝构造函数创建相同的栈。   stack<int> s2(s1);
2. 入栈   void push(const value_type& x);
    出栈   void pop();
    获取栈顶元素value_type&top();
    判断栈是否为空boolempty();
    获取栈的元素数目int size();
入栈、出栈基本数据类型:
string str1 = "0123456789";
stack<int>sta1;
for (auto each : str1)
{
        sta1.push(int(each));   // 入栈
}
cout << "栈的大小:" << sta1.size() << endl;

       
while (!sta1.empty())
{
        int tmp = sta1.top();   // 获取栈顶元素
        sta1.pop();       //出栈
        cout << tmp << " ";
}
入栈出栈类对象和指针(注意深浅拷贝问题):
class Teacher
{
public:
        int age;
        char name;
        Teacher(char* str, int _age)
        {
                strcpy_s(name, str);
                age = _age;
        }
        void printT()
        {
                cout << "name:" << name << "   " << "age:" << age << endl;
        }
};

int main()
{
        Teacher t1("t1", 31), t2("t2", 32), t3("t3", 33);
        stack<Teacher> sta2;    // 装结构体
        stack<Teacher*> sta3;
        sta2.push(t1);    // 入栈
        sta2.push(t2);
        sta2.push(t3);

        sta3.push(&t1);
        sta3.push(&t2);
        sta3.push(&t3);

        while (!sta2.empty())
        {
                Teacher tmp = sta2.top();
                sta2.pop();
                tmp.printT();
        }

        while (!sta3.empty())
        {
                Teacher *tmp = sta3.top();
                sta3.pop();
                tmp->printT();
        }

        system("pause");
        return 0;
}
3、stack小结
        1.堆栈是一种应用非常广泛的数据结构。C++ STL 将这种数据结构和它若干受限制操作用泛型类 stack 容器封装出来,包括堆栈初始化、元素入栈、取栈顶元素、元素出栈、判断堆栈是否非空和取得当前堆栈大小等,应用起来十分容易。
      2.stack的元素出栈操作是不返回栈顶元素的,需要另外通过取栈顶函数获得。这种分离实现是考虑到出栈函数若直接返回栈顶元素,将会导致返回值的数据引用安全问题或不必要的低效复制函数的调用。
        3.从 stack 内部实现看,stack 堆栈是不设最大容量的,但可通过 size 函数获取当前堆栈的大小,以判断是否允许继续让元素入栈,实现具有最大容量限制的堆栈。


   
页: [1]
查看完整版本: 047-C++之STL-->stack