队列(queue)在计算机科学中,是一种先进先出的线性表。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
队列可以采用顺序存储方式来实现(称为顺序队列),或者采用链式存储方式来实现(称为链式队列)。
实现顺序队列需要注意:
(1)采用顺序存储方式,需要预先分配空间,data[maxlen];
(2)采用循环结构克服“假溢出”问题,定义 rear + 1 = front为队列满状态;
(3)顺序队列的应用:输出杨辉三角形。
以下为实现顺序队列的代码,在vs2010上测试通过:
#include <iostream>
using namespace std;
#define maxlen 30
class myQueue
{
public:
myQueue();
bool empty();
bool full();
bool getFrontElement(int &x);//只能访问队列头部的元素
bool push(int x);//在队列尾部插入元素
bool pop();//删除队列头部元素
int size();
private:
int front, rear;//头部尾部索引值
int count;//队列中元素个数
int data[maxlen];
};
int _tmain(int argc, _TCHAR* argv[])
{
//运用队列输出杨辉三角形
int n = 8;//设定杨辉三角形阶数
int s1 = 0, s2 = 0;
myQueue que;
que.push(1);//第一个元素入栈
cout<<1<<endl;
for(int i = 2; i <= n; i++)
{
s1 = 0;//前一个出栈的元素
for(int j = 0; j < i - 1; j++)//对杨辉三角形中第i层,从左到右的元素依次入队列
{
que.getFrontElement(s2);//取队列头元素
que.pop();//列头元素出栈
cout<<s1 + s2<<" ";
que.push(s1 + s2);
s1 = s2;//前一个出栈的元素更新
}
que.push(1);//每行最后一个数值都为1
cout<<1<<endl;
}
return 0;
}
myQueue::myQueue()//初始化
{
front = rear = 0;
count = 0;
}
bool myQueue::empty()
{
if(count == 0)
return true;
else
return false;
}
//教材中对满队列的一种定义
//留出一个元素空间不使用(与栈区分),头,尾索引相差1时,定义为满队列
bool myQueue::full()
{
if(count == maxlen - 1)
return true;
else
return false;
}
bool myQueue::getFrontElement(int &x)
{
if(empty())
return false;
else
{
//队列头索引值所在空间没有存储元素
//访问队列头元素时,front不能变化
//front = (front + 1) % maxlen; //error
x = data[(front + 1) % maxlen];
return true;
}
}
bool myQueue::push(int x)
{
if(full())
return false;
else
{
rear = (rear + 1) % maxlen;
data[rear] = x;
count++;
return true;
}
}
bool myQueue::pop()
{
if(empty())
return false;
else
{
front = (front + 1) % maxlen;//取模运算,与循环队列相符合
count--;
return true;
}
}
int myQueue::size()
{
return count;
}