//在队列中进行插入删除都是单向移动的(方向:高端<下标大的>进入,到低端<下标小的>出。)
//因此在这个过程中,如果在数组高端的最大下标处被元素所占,那么此时发生“假溢出”,为什么是假?
//因为此时的数组低端可能没有元素(已经出队了,但是后面的没出,就造成了堵塞的情况),所以数组低端会发生存储空间闲置,
//所以在完成队列的顺序存储结构时,我们要使用“循环队列 ”,充分调用数组空间,不使他出现空闲状态。
//什么是循环队列?
//将存储队列的数组看成是首尾相连的数组(可以联想一下数字逻辑里面的卡诺图(结合格雷码)就是循环的表),
//即将数组下标最小的延续到最大的后面,
//这种思想可以通过取模的方法来实现:
//1、首先设置一个数组长度大小QueueSize
//2、尾指针(或称尾游标(因为数组的元素位置可以用下标来表示。))的位置为 rear = (rear + 1)% QueueSize
//3、举例说明:定义数组的长度为 5 ,数组下标为0、1、2、3、4。
//4、假设此时 rear = 4(显然数组已经满了),那么下一个元素的位置应该放在 0 的位置上,因为 (rear + 1) % 5 = 0;
//这样就实现了队列的循环。
//那么问题来了,如何判断队列的状态呢?
//看图
//开始实现:
功能:
I-入队
D-出队
G-取队头
E-判空
Q-程序结束
代码:
//数据结构学习笔记(C++):队列的顺序存储 #include#define QueueSize 100 using namespace std; class CirQueue{ public: CirQueue();//构造函数 ~CirQueue();//析构函数 public: void EnQueue(int x);//入队操作 int DeQueue();//出队操作 int GetHead();//取队头元素(并不删除) bool Empty();//判空函数 private: int data[QueueSize];//存放队列的数组 int front, rear;//游标,队头队尾指针 }; CirQueue::CirQueue()//定义构造函数 { rear = front = QueueSize - 1;//使队头队尾指向同一位置,一般指向数组高端 } CirQueue::~CirQueue()//定义析构函数 { //循环队列是静态存储分配,在循环队列变量退出作用域时自动释放所占内存单元,因此,循环队列无需销毁,所以析构函数为空。 } void CirQueue::EnQueue(int x)//定义入队函数 { if((rear + 1) % QueueSize == front ) throw "上溢"; rear = (rear + 1) % QueueSize; data[rear] = x; } int CirQueue::DeQueue()//出队函数定义 { if(rear == front) throw "下溢"; front = (front + 1) % QueueSize;//队头在循环意义下加一 return data[front];//返回队头元素 } int CirQueue::GetHead()//取队头函数定义 { if(rear == front) throw "下溢"; return data[(front + 1 ) % QueueSize];//不修改队头指针 } bool CirQueue::Empty()//判断对空函数 { return (rear == front) ? true:false; } int main() { CirQueue cqueue; char command; int x; try{ while(cin>>command) { if(command == 'Q') return 0; switch(command) { case 'I': cout<<"输入入队元素:"; cin>>x; cqueue.EnQueue(x); cout<<"入队操作完成"<



