C++数据结构(队列)
队列是先进先出的线性表
顺序队列
顺序存储,使用一段连续的内存空间去依次存储队列中的数据
代码实现:
#include <iostream> #define MaxSize 10 template <typename T> class SeqQueue { public: SeqQueue(); ~SeqQueue(); public: bool EnQueue(const T& e); bool DeQueue(T &e); bool GetHead(T &e); void ClearQueue(); void DispList(); int ListLength(); bool IsEmpty(); bool IsFull(); private: T *m_data; int m_front; int m_rear; }; template <typename T> SeqQueue<T>::SeqQueue() { m_data = new T[MaxSize]; m_front = 0; m_rear = 0; } template <typename T> SeqQueue<T>::~SeqQueue() { delete[] m_data; } template <typename T> bool SeqQueue<T>::EnQueue(const T &e) { if (IsFull() == true) { std::cout << "SeqQueue Full" << std::endl; return false; } m_data[m_rear] = e; m_rear++; return true; } template <typename T> bool SeqQueue<T>::DeQueue(T &e) { if (IsEmpty() == true) { std::cout << "SeqQueue Empty" << std::endl; return false; } e = m_data[m_front]; m_front++; return true; } template <typename T> bool SeqQueue<T>::GetHead(T &e) { if (IsEmpty() == true) { std::cout << "SeqQueue Empty" << std::endl; return false; } e = m_data[m_front]; return true; } template <class T> void SeqQueue<T>::DispList() { for (int i = m_front; i < m_rear; i++) { std::cout << m_data[i] << " "; } std::cout << std::endl; } template <class T> int SeqQueue<T>::ListLength() { return m_rear - m_front; } template <class T> bool SeqQueue<T>::IsEmpty() { if (m_front == m_rear) { return true; } return false; } template <class T> bool SeqQueue<T>::IsFull() { if (m_rear >= MaxSize) { return true; } return false; } template <class T> void SeqQueue<T>::ClearQueue() { m_front = m_rear = 0; } int main(void) { SeqQueue<int> seqobj; seqobj.EnQueue(150); seqobj.EnQueue(200); seqobj.EnQueue(300); seqobj.EnQueue(400); seqobj.DispList(); return 0; }
链式队列
如果长度不确定,那么可以使用链式队列
#include <iostream> template <typename T> struct QueueNode { T data; QueueNode<T> *next; }; template <typename T> class LinkQueue { public: LinkQueue(); ~LinkQueue(); public: bool EnQueue(const T &e); bool DeQueue(T &e); bool GetHead(T &e); void DispList(); int ListLength(); bool IsEmpty(); private: QueueNode<T> *m_front; QueueNode<T> *m_rear; int m_length; }; template <typename T> LinkQueue<T>::LinkQueue() { m_front = new QueueNode<T>; m_front->next = nullptr; m_rear = m_front; m_length = 0; } template <typename T> LinkQueue<T>::~LinkQueue() { QueueNode<T> *pnode = m_front->next; QueueNode<T> *ptmp; while (pnode != nullptr) { ptmp = pnode; pnode = pnode->next; delete ptmp; } delete m_front; m_front = m_rear = nullptr; m_length = 0; } template <typename T> bool LinkQueue<T>::EnQueue(const T &e) { QueueNode<T> *node = new QueueNode<T>; node->data = e; node->next = nullptr; m_rear->next = node; m_rear = node; m_length++; return true; } template <typename T> bool LinkQueue<T>::DeQueue(T &e) { if (IsEmpty() == true) { std::cout << "LinkQueue Empty" << std::endl; return false; } QueueNode<T> *p_willdel = m_front->next; e = p_willdel->data; m_front->next = p_willdel->next; if (m_rear == p_willdel) { m_rear = m_front; } delete p_willdel; m_length--; return true; } template <typename T> bool LinkQueue<T>::GetHead(T &e) { if (IsEmpty() == true) { std::cout << "Link Queue Empty" <<std::endl; return false; } e = m_front->next->data; return true; } template <class T> void LinkQueue<T>::DispList() { QueueNode<T> *p = m_front->next; while (p != nullptr) { std::cout << p->data << " "; p = p->next; } std::cout << std::endl; } template <class T> int LinkQueue<T>::ListLength() { return m_length; } template <class T> bool LinkQueue<T>::IsEmpty() { if (m_front == m_rear) { return true; } return false; } int main(void) { LinkQueue<int> lnobj; lnobj.EnQueue(150); int eval2 = 0; lnobj.DeQueue(eval2); lnobj.EnQueue(200); lnobj.EnQueue(700); lnobj.DispList(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具