• C++ 中的容器(栈、堆、队列) 转


    C++中堆,栈,队列

     

    C/C++内存分为五个部分:

    1、栈区(stack):存放函数的参数值,局部变量的值等(编译器自动分配释放 )。  

    2、堆区(heap): 注意:与数据结构中的堆完全不同,分配方式类似于链表(程序员分配释放,若程序员不释放,程序结束时可能由OS回收 )。  

    3、全局区(静态区):全局变量和静态变量存储在一块,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(程序结束后由系统释放)。

    4、文字常量区:常量字符串就是存储在这里(程序结束后由系统释放)。

    5、程序代码区:存放函数体的二进制代码。   

    unix环境高级编程一书中,对于栈和堆是这样定义的:

    :自动变量以及每次函数调用是所需保存的信息都存放在此段中。每次调用函数时,其返回地址以及调用者的环境信息(例如某些机器寄存器的值)都存放在栈中。然后,最近被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,可以递归调用c函数。递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。

    :通常在堆中进行动态存储分配,由于历史上形成的惯例,堆位于非初始化数据段和栈之间。

    c++stack容器介绍,引自https://www.cnblogs.com/hdk1993/p/5809161.html

    c++stack(堆栈)是一个容器的改编,它实现了一个先进后出的数据结构(FILO)

    使用该容器时需要包含#include<stack>头文件;

    定义stack对象的示例代码如下:

    stack<int>s1;

    stack<string>s2;

    stack的基本操作有:

    1.入栈:如s.push(x);

    2.出栈:如 s.pop().注意:出栈操作只是删除栈顶的元素,并不返回该元素。

    3.访问栈顶:如s.top();

    4.判断栈空:如s.empty().当栈空时返回true。

    5.访问栈中的元素个数,如s.size();

    下面举一个简单的例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include<iostream> 
    #include<stack> 
    using namespace std; 
    int main(void
        stack<double>s;//定义一个栈 
        for(int i=0;i<10;i++) 
            s.push(i); 
        while(!s.empty()) 
        
            printf("%lf ",s.top()); 
            s.pop(); 
        
        cout<<"栈内的元素的个数为:"<<s.size()<<endl; 
        return 0; 
    }
     

    2、队列(queue)说明及举例:

    使用队列,要先包含头文件 : #include<queue>

    定义队列,以如下形式实现: queue<Type> q; 其中Type为数据类型(如 int,float,char等)。

    队列的主要操作:

    q.push(item) //将item压入队列尾部
    q.pop() //删除队首元素,但不返回
    q.front() //返回队首元素,但不删除
    q.back() //返回队尾元素,但不删除
    q.size() //返回队列中元素的个数
    q.empty() //检查队列是否为空,如果为空返回true,否则返回false

    队列操作举例


    #include<iostream>
    #include<stack>
    #include<queue>
    using namespace std;

    void main()
    {
    queue<int> q;
    int num;

    cout<<"------Test for Queue-------"<<endl;
    cout<<"Input number:"<<endl;
    while(cin>>num)
    {
    q.push(num);
    }
    cout<<"Now the Queue has "<<q.size()<<" numbers."<<endl;
    cout<<"The first is "<<q.front()<<endl;
    cout<<"The last is "<<q.back()<<endl;
    cout<<"All numbers:"<<endl;
    while(!q.empty())
    {
    cout<<q.front()<<" ";
    q.pop();
    }
    cout<<"Now the Queue has "<<q.size()<<" numbers."<<endl;
    system("Pause");


    }

    参考: https://blog.csdn.net/dai_wen/article/details/81712239

    STL:https://blog.csdn.net/qq_37360631/article/details/81299507

  • 相关阅读:
    设计模式:备忘录模式??
    jQuery总结
    MYSQL(三)
    MYSQL(二)
    MYSQL(一)
    Web.xml配置详解
    Spring-JDBC通用Dao
    网络七层协议的形象说明
    网络编程概念
    JSP 9 大内置对象详解
  • 原文地址:https://www.cnblogs.com/superjn/p/10755208.html
Copyright © 2020-2023  润新知