stack&queue&list

環(huán)境:ide:Mac+clion

視頻鏈接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5

stack 容器,棧容器。先進后出。 類似于壓子彈。只有一個出口。而且棧不允許有遍歷的行為。

棧可以判斷是否為空??梢耘袛鄺5膫€數(shù)。
入棧:push
出棧:pop
棧頂元素:top
棧的大?。簊ize

void test(){
    stack<int>s;//先進后出的容器。
    s.push(10);//入棧/壓棧
    s.push(20);
    s.push(30);
    s.push(40);
    cout <<"入棧后的大小"<< s.size()<<endl;//4
    while(!s.empty()){
        cout << s.top()<<endl;//打印棧頂元素。
        s.pop();//出棧。
    }
    cout << "出棧后的大小"<<s.size()<<endl;//0
}

queue 先進先出的數(shù)據(jù)結(jié)構(gòu) 和stack 正好相反。 有兩個出口。 一頭負責push,一頭負責pop。 這樣就保證了先進先出的特性。只有對頭和對尾進行操作。 不允許遍歷。

stl 提供了如下函數(shù):入隊push/出隊pop/隊尾back/隊頭front/是否為空empty/大小size

void test1(){
    queue<Person>q;//先進先出的數(shù)據(jù)結(jié)構(gòu)。
    Person p1("sheik1",10);
    Person p2("sheik2",20);
    Person p3("sheik3",30);
    Person p4("sheik4",40);
    q.push(p1);//入隊
    q.push(p2);
    q.push(p3);
    q.push(p4);
    cout << "queue 大小:"<<q.size()<<endl;
    while (!q.empty()){
        cout <<"隊頭中的數(shù)據(jù)姓名:"<< q.front().m_Name<<"  年齡:"<<q.front().m_Age<<endl;
        cout <<"隊尾中的數(shù)據(jù)姓名:"<< q.back().m_Name<<"  年齡:"<<q.back().m_Age<<endl;
        q.pop();

    }
    cout << "queue 大小:"<<q.size()<<endl;
//    queue 大小:4
//    隊頭中的數(shù)據(jù)姓名:sheik1  年齡:10
//    隊尾中的數(shù)據(jù)姓名:sheik4  年齡:40
//    隊頭中的數(shù)據(jù)姓名:sheik2  年齡:20
//    隊尾中的數(shù)據(jù)姓名:sheik4  年齡:40
//    隊頭中的數(shù)據(jù)姓名:sheik3  年齡:30
//    隊尾中的數(shù)據(jù)姓名:sheik4  年齡:40
//    隊頭中的數(shù)據(jù)姓名:sheik4  年齡:40
//    隊尾中的數(shù)據(jù)姓名:sheik4  年齡:40
//    queue 大小:0
}

list 容器,將數(shù)據(jù)進行鏈式存儲。數(shù)據(jù)中的邏輯是通過鏈表指針實現(xiàn)。由各種結(jié)點構(gòu)成。結(jié)點是由數(shù)據(jù)域與指針域構(gòu)成。

優(yōu)點:就是可以快速的任意位置插入和刪除。
缺點:
1.占用內(nèi)存大。
2.遍歷速度沒有數(shù)組快。
STL中的鏈表是雙向鏈表。
STL中l(wèi)ist 和vector 是比較常用的容器。
list 構(gòu)造和賦值:

void printList(const list<int> &l){
    for (list<int>::const_iterator it = l.begin();it!= l.end();it++){
        cout << *it << " ";
    }
    cout << endl;
}

void test2(){
    list<int>l;//默認構(gòu)造函數(shù)。
    l.push_back(10);//尾插法,填入數(shù)據(jù)
    l.push_back(20);
    l.push_back(30);
    l.push_back(40);
    printList(l);
    list<int>l1(l);//這里類似于copy 構(gòu)造函數(shù)
    printList(l1);
    list<int>l2(l.begin(),l.end());//通過區(qū)間來進行構(gòu)造了
    printList(l2);
    list<int>l3(4,66);//使用66 初始化四個元素。
    printList(l3);
    list<int>l4 = l3;//直接使用operator=來進行賦值。
    printList(l4);

    list<int>l5 ;
    l5.assign(l1.begin(),l1.end());//通過assign的方式進行賦值。
    printList(l5);

    list<int>l6;
    l6.assign(4,777);//通過assign的方式進行賦值。
    printList(l6);
    l1.swap(l6);//交換。
    printList(l1);
    printList(l6);
}

list 大?。簊ize/empty/resize 等函數(shù)。
list 容器的插入和刪除:這里提供了一個remove 的函數(shù),可以刪除list 中某個elem。

void test3(){
    list<int>l;//默認構(gòu)造函數(shù)。
    l.push_back(10);//尾插法,填入數(shù)據(jù)
    l.push_back(20);
    l.push_back(30);
    l.push_back(40);

    l.push_front(100);//頭插法
    l.push_front(200);
    l.push_front(300);
    l.push_front(400);
    printList(l);//400 300 200 100 10 20 30 40

    l.pop_back();//尾刪
    printList(l);//400 300 200 100 10 20 30
    l.pop_front();//頭刪
    printList(l);//300 200 100 10 20 30

//    插入
    l.insert(l.begin(),1);
    printList(l);//1 300 200 100 10 20 30
    list<int>::iterator it = l.begin();
    l.insert(++(++it),5);
    printList(l);

    //刪除
    it = l.begin();
    l.erase(it);
    printList(l);
    l.push_back(5);
    printList(l);//300 5 200 100 10 20 30 5
    l.remove(5);//刪除list 中所有=5的元素。
    printList(l);//300 200 100 10 20 30
    
};

list 容器數(shù)據(jù)存取:不支持[] 和at 訪問list 里面的數(shù)據(jù)。

void test4(){
    list<int>l;//默認構(gòu)造函數(shù)。
    l.push_back(10);//尾插法,填入數(shù)據(jù)
    l.push_back(20);
    l.push_back(30);
    l.push_back(40);
    //不支持[] 和at 訪問list 里面的數(shù)據(jù)。
    cout<<"第一個元素:"<<l.front()<<endl;
    cout << "最后一個元素:"<<l.back()<<endl;
}

list 反轉(zhuǎn)/排序,這里面有一個降序排序,引入了一個仿函數(shù)。

bool myCompare(int v1,int v2){
    return v1 > v2;//如果降序,那么就需要v1 > v2
}

void test5(){
    list<int>l;//默認構(gòu)造函數(shù)。
    l.push_back(10);//尾插法,填入數(shù)據(jù)
    l.push_back(30);
    l.push_back(20);
    l.push_back(40);
    cout << "反轉(zhuǎn)前打印:"<<endl;
    printList(l);//10 30 20 40
    l.reverse();
    cout << "反轉(zhuǎn)后打印:"<<endl;
    printList(l);//40 20 30 10
    l.sort();//默認排序規(guī)則:從小到大
    cout << "排序后打印:"<<endl;
    printList(l);//10 20 30 40
    cout << "降序后打印:"<<endl;
    l.sort(myCompare);//降序排序,需要引入仿函數(shù)。
    printList(l);//40 30 20 10
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容