队列是一种受限的线性表,它是一种运算受阻的线性表,先进先出。
它只允许在表的前端(front)进行删除操作,在表的后端(rear)进行插入操作。
#include <iostream>
#define MAX_SIZE 5
using namespace std;
typedef int DataType;
typedef struct MyStruct
{
DataType queue[MAX_SIZE];
int front;
int rear;
}SeqQueue;
//初始化
void initQueue(SeqQueue& SQ)
{
SQ.front = SQ.rear = 0;
}
//判断队列是否为满
int isFull(SeqQueue& SQ)
{
if (SQ.rear == MAX_SIZE) return 1;
return 0;
}
//判断队列是否为空
int isEmpty(SeqQueue& SQ)
{
if (SQ.front == SQ.rear) return 1;
return 0;
}
//入队,队列只能从后端入队列
int enterQueue(SeqQueue& SQ, DataType data)
{
if (isFull(SQ)) {
cout << "队列已满" << endl;
return 0;
}
SQ.queue[SQ.rear] = data;
SQ.rear++;
return 1;
}
//输出
void printQueue(SeqQueue& SQ)
{
int i = SQ.front;
while (i<SQ.rear)
{
cout << SQ.queue[i] << "\t";
i++;
}
cout << endl;
}
//出队,出队头,所有数据向前移(和顺序表一样,效率低)
int deleteQueue1(SeqQueue& SQ, DataType& data)
{
if (isEmpty(SQ))
{
cout << "队列为空" << endl;
return 0;
}
data = SQ.queue[SQ.front];
for (int i = SQ.front-1; i < SQ.rear; i++)
{
SQ.queue[i-1] = SQ.queue[i];
}
SQ.rear--;
return 1;
}
//出队,将front向后移动(效率高,但浪费空间)
int deleteQueue2(SeqQueue& SQ, DataType& data)
{
if (isEmpty(SQ))
{
cout << "队列为空" << endl;
return 0;
}
if (SQ.front > MAX_SIZE) cout << "队列已到尽头" << endl;
data = SQ.queue[SQ.front];
SQ.front++;
return 1;
}
//清空队列
void clearQueue(SeqQueue& SQ)
{
SQ.front = SQ.rear = 0;
}
int getLength(SeqQueue& SQ)
{
return SQ.rear - SQ.front;
}
int main()
{
SeqQueue SQ;
DataType data;
initQueue(SQ);
for (int i = 0; i < 10; i++)
{
if (enterQueue(SQ, i))cout << i << ",入队成功!" << endl;
}
printQueue(SQ);
if (deleteQueue1(SQ, data))cout << data << ",已出队" << endl;
printQueue(SQ);
if (deleteQueue2(SQ, data))cout << data << ",已出队" << endl;
printQueue(SQ);
clearQueue(SQ);
system("pause");
return 0;
}