《C++实现数据结构》:队列
来源:互联网 发布:对撞机 知乎 编辑:程序博客网 时间:2024/06/11 12:28
队列是限定在表的一端插入,在表的另一端删除的线性表,是先进先出(FIFO)的线性数据结构。
队列基类如下:
#include <iostream>using namespace std;//队列基类template <typename T>class Queue{public: virtual bool IsEmpty() const = 0; //若队列空,则返回true virtual bool IsFull() const = 0; //若队列满,则返回true virtual bool Front(T &x) const = 0; //在x中返回队头元素,操作成功则返回true virtual bool Enqueue(T x) = 0; //在队尾插入元素x,操作成功则返回true virtual bool Dequeue() = 0; //从队列中删除队头元素,操作成功则返回true virtual bool Clear() = 0; //清除队列中的元素};
一、队列的顺序表示
需要用到2个指针front和rear,front指向队头元素的前一单元,rear指向队尾元素。使用循环队列结构可以解决“假溢出”现象。
为使入队和出队实现循环,可以利用取余运算符。
队头指针进1:front=(front+1)%maxSize
队尾指针进1:rear=(rear+1)%maxSize
在循环队列结构下,当front==rear时为空队列,当(rear+1)%maxSize == front时为满队列。满队时实际仍有一个元素的空间未使用,这是为了与空队列的判断标准区分开。
//队列的顺序表示,循环队列template <typename T>class SeqQueue:public Queue<T> {private: int front,rear; //front指向队头元素的前一单元,rear指向队尾元素 int maxSize; //数组的最大长度 T *q;public: SeqQueue(int mSize); ~SeqQueue(); bool IsEmpty() const; //若队列空,则返回true bool IsFull() const; //若队列满,则返回true bool Front(T &x) const; //在x中返回队头元素,操作成功则返回true bool Enqueue(T x); //在队尾插入元素x,操作成功则返回true bool Dequeue(); //从队列中删除队头元素,操作成功则返回true bool Clear(); //清除队列中的元素};template <typename T>SeqQueue<T>::SeqQueue(int mSize) { maxSize = mSize; q = new T[maxSize]; front = rear = 0;}template <typename T>SeqQueue<T>::~SeqQueue() { delete[]q;}template <typename T>bool SeqQueue<T>::IsEmpty() const { return front == rear; //在循环队列下,当front==rear时表示空队列}template <typename T>bool SeqQueue<T>::IsFull() const { return (rear + 1) % maxSize == front; //注意满队时列时实际仍有一个元素的空间未使用,要与空队列区分开}template <typename T>bool SeqQueue<T>::Front(T &x) const { if (IsEmpty()) { cout<<"Empty"<<endl; return false; } x = q[(front + 1) % maxSize]; return true;}template <typename T>bool SeqQueue<T>::Enqueue(T x) { if (IsFull()) { cout<<"Full"<<endl; return false; } rear = (rear + 1) % maxSize; q[rear] = x; return true;}template <typename T>bool SeqQueue<T>::Dequeue() { if (IsEmpty()) { cout<<"Empty"<<endl; return false; } front = (front + 1) % maxSize; return true;}template <typename T>bool SeqQueue<T>::Clear() { front = rear; return true;}
二、队列的链接表示
队头指针front充当链表的表头结点,队尾指针rear指向队尾结点。
//队列的链接表示template <typename T>class SingleQueue;template <typename T>class Node{ T element; Node<T>* next; friend class SingleQueue<T>;};template <typename T>class SingleQueue:public Queue<T>{private: Node<T>* front; Node<T>* rear; bool IsFull() const {} //若队列满,则返回truepublic: SingleQueue(); ~SingleQueue(); bool IsEmpty() const; //若队列空,则返回true bool Front(T &x) const; //在x中返回队头元素,操作成功则返回true bool Enqueue(T x); //在队尾插入元素x,操作成功则返回true bool Dequeue(); //从队列中删除队头元素,操作成功则返回true bool Clear(); //清除队列中的元素};template <typename T>SingleQueue<T>::SingleQueue() { front = new Node<T>; front->next = NULL; rear = front;}template <typename T>SingleQueue<T>::~SingleQueue() { Node<T>* p; while (front != NULL) { p = front; front = front->next; delete (p); }}template <typename T>bool SingleQueue<T>::IsEmpty() const { if (front == rear) { return true; } else { return false; }}template <typename T>bool SingleQueue<T>::Front(T &x) const { if (IsEmpty()) { cout<<"Empty"<<endl; return false; } Node<T> *p = front->next; x = p->element; return true;}template <typename T>bool SingleQueue<T>::Enqueue(T x) { Node<T>* p = new Node<T>; p->element = x; p->next = NULL; rear->next = p; rear = p;}template <typename T>bool SingleQueue<T>::Dequeue() { if (IsEmpty()) { cout<<"Empty"<<endl; return false; } Node<T> *p = front->next; front->next = p->next; delete (p);}template <typename T>bool SingleQueue<T>::Clear() { Node<T> *p = front->next; Node<T> *q; while (p != NULL) { q = p; p = p->next; delete (q); } rear = front;}
最后的测试代码:
int main() { int n = 5; Queue<int> *queue = new SeqQueue<int>(n);// Queue<int> *queue = new SingleQueue<int>; for (int i = 1; i < 5; ++i) { queue->Enqueue(i); } queue->Enqueue(6); int x; if (queue->Front(x)) { cout<<x<<endl; } queue->Dequeue(); if (queue->Enqueue(6)) { cout<<"Successful"<<endl; } queue->Clear(); queue->Front(x); return 0;}
0 0
- C数据结构实现队列
- 数据结构.队列(C语言实现)
- 数据结构---队列C语言实现
- 数据结构之队列(C实现)
- 数据结构之队列的实现(c语言)
- C语言实现数据结构中的链队列
- 数据结构的C实现_链式队列
- 数据结构的C实现_循环队列
- 数据结构---队列链表c实现
- 数据结构---队列顺序表c实现
- 数据结构循环队列的实现c程序
- 数据结构:队列(C语言实现)
- 数据结构(C语言)实现循环队列
- 数据结构实现链式队列(C语言)
- 数据结构C语言实现之循环队列
- 数据结构C语言实现之链队列
- 用C语言模块实现队列数据结构
- 数据结构.循环队列(C语言实现)
- banner(图片轮播)框架的使用
- AndroidStudio下ButterKnife的集成和使用
- PHP中的socket函数
- GYM 101173 K.Key Knocking(构造)
- ADO.NET 连接数据库字符串小结(Oracle、SqlServer、Access、ODBC)
- 《C++实现数据结构》:队列
- acm程序设计书中的题目j
- sql语句 rollup() 面向 oracle
- HashMap深度解析(一)
- List
- Date日期(Calendar获取方法)
- VS2013中为C++程序生成lib和dll文件
- 非递归快排
- 面向对象与原型理解笔记