又是美好的一天哈,继续码代码~~
本文介绍了顺序队列的实现,与我之前写的博客《栈之顺序栈》代码大体相同。不同的地方是,入队是从队尾开始,而入栈是从栈顶开始,故队列多了一个队尾指针。这里要注意的是,队首指针始终指向队头元素,而队尾指针始终指向对头元素的后一位。
#include<cstdio>
#define QueueSize 100 //假定预分配的顺序队列空间最多为100个元素
typedef char Datatype; //假定顺序队列元素的数据类型为字符
typedef struct {
Datatype data[QueueSize];
int front;
int rear;
}SeqQueue;
//********************************顺序队列的一些基本操作**********************************
void InitQueue(SeqQueue *Q){
//将顺序顺序队列置空
Q->front=Q->rear=0;
}
int QueueEmpty(SeqQueue *Q){
//判断顺序顺序队列是否为空,若为空,则返回真,否则返回假
return Q->front==Q->rear;
}
int QueueFull(SeqQueue *Q){
//判断顺序队列是否满了,若满了则返回真,否则返回假
return (!QueueEmpty(Q)&&Q->rear==QueueSize-2);
}
void EnQueue(SeqQueue *Q,Datatype x){
//进顺序队列操作
if(QueueFull(Q)){
printf("Queue overflow\n"); //上溢,退出运行
return ;
}
Q->data[Q->rear]=x; //将新元素插入队尾
Q->rear++; //将队尾指针加1
}
void DeQueue(SeqQueue *Q){
//出顺序队列操作
if(QueueEmpty(Q)){
printf("Queue underflow\n"); //下溢,退出运行
return ;
}
Q->front++; //将队头指针加1
}
Datatype QueueFront(SeqQueue *Q){
//取顺序队列顶元素
if(QueueEmpty(Q)){ //顺序队列空则无法取顺序队列队首元素
printf("Queue is empty!\n");
return '?';
}
return Q->data[Q->front];
}
void CreateQueue(SeqQueue *Q){
//建立一个顺序队列
char ch;
while((ch=getchar())!='\n'){
EnQueue(Q,ch);
}
return ;
}
//***********************************测试函数********************************
int main(){
SeqQueue *Q;
InitQueue(Q);
printf("输入一个字符串,来建立一个字符串顺序队列:\n");
CreateQueue(Q);
printf("顺序队列已建好!\n");
printf("顺序队列队头元素是:%c\n",QueueFront(Q));
printf("弹出顺序队列队头元素:\n");
DeQueue(Q);
printf("此时顺序队列队头元素为:%c\n",QueueFront(Q));
printf("将元素‘z’入队:\n");
EnQueue(Q,'z');
printf("此时队头元素是:%c\n",QueueFront(Q));
return 0;
}
测试样例:
与顺序栈的实现相同,由于其结构的顺序特征,从而可以用数组来模拟顺序队列,具体代码与我的博客《栈之顺序栈》中的类似,这里就不再贴出了,有需要的可以查看那篇文章。