数据结构——队列

    xiaoxiao2023-11-16  157

    目录

    队列

    队列与栈的区别

    队列的操作 

    队列的种类

    顺序队列

     链式队列

    循环队列

    双向队列


     

     首先说一下,我觉得吧,越往后学数据结构,c++这种面向对象的编程会越来越方便清晰,所以从本节开始,我会慢慢开始用c++来写数据结构。没学的得学一下了。c++兼容c,好学的!

    队列与栈的区别

    上一次说了,栈是先进后出的形式,你可以把数据的存放想象成忘一个箱子里面放书,先放的书摞在后放的书下面,如果要取最先放进去的那本书,得依次把书取出来,这就是先进后出。

    队列是先进先出的形式,你可以把数据的存放想象成排队买饭,先到的先买,买完就走。

    队列的操作 

    依旧待补充,我先把数据结构过一遍,回来再补充吧

    插入push()弹出 pop()判空empty()长度size()取队首元素front() 

    队列的种类

    队列还是有不少类型的,不过大致划分为

    顺序队列链式队列循环队列双向队列

    顺序队列

    直接开辟一个固定的空间,往里存就是了。上数据结构了:

    class queue{ public: int value[maxlen]; int front,rear; queue(); bool push(int x); int pop(); int getfront(); bool empty(); };

    对应上面提到的各种函数,我汇集到这里

    queue::queue(){ front = rear = 0; } bool queue::push(int x){ if(rear < maxlen-1){ value[rear] = x; rear ++; cout<<"I pushed "<<x<<" in"<<endl; return true; } else{ printf("queue overflowed \n"); return false; } } int queue::pop(){ int ans; if(front <= rear){ ans = value[front]; front ++; return ans; } else{ printf("queue overflowed \n"); return 0x3fff; } } bool queue::empty(){ if(front <= rear){ return false; } return true; } int queue::getfront(){ return value[front]; }

     主函数

    int main(){ queue que; int i = 0 ; while(i<5){ que.push(i); i++; } cout<<que.getfront()<<endl; while(i>=0){ printf("%d ",que.pop()); i--; } cout<<que.getfront()<<endl; return 0; } 顺序队列模板化

    由于我们平时使用队列或者栈的时候,都是直接在c++的stl库中调用,然后自己指定一下数据类型就可以了。

    学前准备

    出于方便,我也写了一个实现这种功能的模板。用到的是c++的模板类,如果不太会,请看这里

    这个头文件考虑了程序的健壮性,所以使用了c++ 的异常处理,不太会的,看这里。

     

    模板类

    使用 #include "queue.h" 完成调用。需要区别于stl库中的queue,那个是使用 #include <queue>完成调用的。

    // queue.h #include<vector> #include <stdexcept> //这个地方考虑了程序健壮性使用了异常处理。如果不会可以再看刚才那个网站 using namespace std; template<typename T> class queue{ private: vector<T> elems; public: int front; int rear; queue(){ front = rear = 0; } void push(T const&); T pop(); T Front() const; bool empty() const{ return elems.empty(); } int size() { return elems.size(); } }; template <typename T> void queue<T>::push(T const & elem){ elems.push_back(elem); rear ++; } template <typename T> T queue<T>::pop(){ if(front > rear){ throw out_of_range("queue<>::pop():empty queue"); } T ans = elems[front]; front ++; return ans; } template <typename T> T queue<T>::Front() const{ if(elems.empty()){ throw out_of_range("queue<>::pop():empty queue"); } return elems[front]; }

    这个头文件的测试文件queuetest.cpp

    #include "queue.h" #include <cstdlib> #include <string> #include <iostream> using namespace std; int main(){ try{ queue<int> que; int i = 0; while(i<5){ que.push(i); cout<<"I pushed "<<i<<"in"<<endl; i++; } //cout<<que.size()<<endl; while(i>0){ cout<<que.pop()<<" "; i--; } cout<<endl; }catch(exception const & ex){ cerr <<"Exception: "<<ex.what() <<endl; return -1; } }

     

     链式队列

    循环队列

    双向队列

     

    最新回复(0)