- 直接写一个队列和教材上对比
- 双端队列学习
- 队列的应用一:报数问题
- 队列的应用二:求解迷宫
- 习题板块
//自己写的链式结构队列
// 要实现的操作有: 初始化initqueue , 销毁destroyqueue , 判断为空emptyqueue
// 进队列enqueue , 出队列dequeue 打印队列prntqueue
#include<bits/stdc .h>
using namespace std;
typedef struct qnode{
int data;
struct qnode *next;
}datanode;
typedef struct{
datanode *front;
datanode *rear;
}squeue;
void initqueue(squeue*&q){
q=(squeue*)malloc(sizeof(squeue));
q->front=q->rear=NULL;
}
void destroyqueue(squeue*&q){
datanode*pre=q->front,*p;
if(pre!=NULL)
{
p=pre->next;
while(p!=NULL){
free(pre);
pre=p;p=p->next;
}
free(pre);
}
free(q);
}
bool emptyqueue(squeue*&q){
return (q->rear==NULL);
}
void enqueue(squeue*&q,int e){
//这里有两种情况,1队列为空,2队列不空
datanode *p;
p=(datanode*)malloc(sizeof(datanode));
p->data=e;
p->next=NULL;
if(q->rear==NULL)
q->rear=q->front=p;
else{
q->rear->next=p;
q->rear=p;
}
}
bool dequeue(squeue*&q,int &e){
//这里有三种情况,1队列为空,2队列中只有一个结点,3队列中有两个及其以上结点
datanode*p;
if(q->rear==NULL)
return false;
p=q->front;
if(q->rear==q->front)
q->rear=q->front=NULL;
else
q->front=q->front->next;
e=p->data;
free(p);
return true;
}
void printqueue(squeue*q){
datanode *p=q->front;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int main(){
int e;
squeue * q;
initqueue(q);
for(int i=1;i<10;i )
enqueue(q,i);
printqueue(q);
dequeue(q,e);
dequeue(q,e);
printqueue(q);
}
教材标准队列
代码语言:javascript复制//链队运算算法
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct DataNode
{
ElemType data;
struct DataNode *next;
} DataNode; //链队数据结点类型
typedef struct
{
DataNode *front;
DataNode *rear;
} LinkQuNode; //链队类型
void InitQueue(LinkQuNode *&q)
{
q=(LinkQuNode *)malloc(sizeof(LinkQuNode));
q->front=q->rear=NULL;
}
void DestroyQueue(LinkQuNode *&q)
{
DataNode *p=q->front,*r;//p指向队头数据结点
if (p!=NULL) //释放数据结点占用空间
{ r=p->next;
while (r!=NULL)
{ free(p);
p=r;r=p->next;
}
}
free(p);
free(q); //释放链队结点占用空间
}
bool QueueEmpty(LinkQuNode *q)
{
return(q->rear==NULL);
}
void enQueue(LinkQuNode *&q,ElemType e)
{ DataNode *p;
p=(DataNode *)malloc(sizeof(DataNode));
p->data=e;
p->next=NULL;
if (q->rear==NULL) //若链队为空,则新结点是队首结点又是队尾结点
q->front=q->rear=p;
else
{ q->rear->next=p; //将p结点链到队尾,并将rear指向它
q->rear=p;
}
}
bool deQueue(LinkQuNode *&q,ElemType &e)
{ DataNode *t;
if (q->rear==NULL) //队列为空
return false;
t=q->front; //t指向第一个数据结点
if (q->front==q->rear) //队列中只有一个结点时
q->front=q->rear=NULL;
else //队列中有多个结点时
q->front=q->front->next;
e=t->data;
free(t);
return true;
}
双端队列
为了节约时间,我就没写了
教材标准双端队列
代码语言:javascript复制//双端队列算法
#include "sqqueue.cpp"
bool deQueue1(SqQueue *&q,ElemType &e) //从队尾删除
{
if (q->front==q->rear) //队空
return false;
e=q->data[q->rear]; //提取队尾元素
q->rear=(q->rear-1 MaxSize)%MaxSize; //修改除尾指针
return true;
}
bool enQueue1(SqQueue *&q,ElemType e) //从队头插入
{
if ((q->rear 1)%MaxSize==q->front) //队满
return false;
q->data[q->front]=e; //e元素进队
q->front=(q->front-1 MaxSize)%MaxSize; //修改队头指针
return true;
}
int main()
{
ElemType e;
int i;
SqQueue *q;
InitQueue(q);
printf("从队尾插入a,b,从队头插入c,d,从队尾插入en");
enQueue(q,'a'); //从队尾插入'a'
enQueue(q,'b'); //从队尾插入'b'
enQueue1(q,'c'); //从队头插入'c'
enQueue1(q,'d'); //从队头插入'd'
enQueue(q,'e'); //从队尾插入'e'
printf("从队头出队两个元素:");
for (i=1;i<=2;i )
{
deQueue(q,e); //从队头删除
printf("%c ",e);
}
printf("n从队尾出队其他元素:");
while (!QueueEmpty(q))
{
deQueue1(q,e); //从队尾删除
printf("%c ",e);
}
printf("n");
return 1;
}
报数问题
设有n个人站成一排,从左向右的编号分别为1-n,现在从左边往右报数“1,2,1,2,。。。“,数到”1“的人出列,数到”2”的人立即站到队伍的最右端。报数过程反复进行,直到n个人都出列为止。要求给出他们的出列顺序。 例如,当n=8时初始序列为: 1 2 3 4 5 6 7 8 则出列顺序为: 1 3 5 7 2 6 4 8
我就用自己写的队列来做把
代码语言:javascript复制//自己写的链式结构队列
// 要实现的操作有: 初始化initqueue , 销毁destroyqueue , 判断为空emptyqueue
// 进队列enqueue , 出队列dequeue 打印队列prntqueue
#include<bits/stdc .h>
using namespace std;
typedef struct qnode{
int data;
struct qnode *next;
}datanode;
typedef struct{
datanode *front;
datanode *rear;
}squeue;
void initqueue(squeue*&q){
q=(squeue*)malloc(sizeof(squeue));
q->front=q->rear=NULL;
}
void destroyqueue(squeue*&q){
datanode*pre=q->front,*p;
if(pre!=NULL)
{
p=pre->next;
while(p!=NULL){
free(pre);
pre=p;p=p->next;
}
free(pre);
}
free(q);
}
bool emptyqueue(squeue*&q){
return (q->rear==NULL);
}
void enqueue(squeue*&q,int e){
//这里有两种情况,1队列为空,2队列不空
datanode *p;
p=(datanode*)malloc(sizeof(datanode));
p->data=e;
p->next=NULL;
if(q->rear==NULL)
q->rear=q->front=p;
else{
q->rear->next=p;
q->rear=p;
}
}
bool dequeue(squeue*&q,int &e){
//这里有三种情况,1队列为空,2队列中只有一个结点,3队列中有两个及其以上结点
datanode*p;
if(q->rear==NULL)
return false;
p=q->front;
if(q->rear==q->front)
q->rear=q->front=NULL;
else
q->front=q->front->next;
e=p->data;
free(p);
return true;
}
void printqueue(squeue*q){
datanode *p=q->front;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int main(){
squeue *q;
initqueue(q);
int n;//声明n个人
n=8;//因为题目中是8个人
for(int i=1;i<=n;i )
enqueue(q,i);
printqueue(q);
int e;
int match=0;//喊一喊二
while(q->rear!=NULL){
match=(match 1)%2;
if(match){
dequeue(q,e);
cout<<e<<" ";
}
else{
dequeue(q,e);
enqueue(q,e);
}
}
}
标准答案
代码语言:javascript复制//求解报数问题
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef int ElemType;
//----------------------------------------------------------
//-环形队列的基本运算算法-----------------------------------
//----------------------------------------------------------
typedef struct
{ ElemType data[MaxSize]; //存放队中元素
int front,rear; //队头和队尾指针
} SqQueue; //顺序队类型
void InitQueue(SqQueue *&q) //初始化队列
{ q=(SqQueue *)malloc (sizeof(SqQueue));
q->front=q->rear=0;
}
void DestroyQueue(SqQueue *&q) //销毁队列
{
free(q);
}
bool QueueEmpty(SqQueue *q) //判断队列是否为空
{
return(q->front==q->rear);
}
bool enQueue(SqQueue *&q,ElemType e) //进队列
{ if ((q->rear 1)%MaxSize==q->front) //队满上溢出
return false;
q->rear=(q->rear 1)%MaxSize;
q->data[q->rear]=e;
return true;
}
bool deQueue(SqQueue *&q,ElemType &e) //出队列
{ if (q->front==q->rear) //队空下溢出
return false;
q->front=(q->front 1)%MaxSize;
e=q->data[q->front];
return true;
}
//----------------------------------------------------------
void number(int n)
{
int i; ElemType e;
SqQueue *q; //环形队列指针
InitQueue(q); //初始化队列
for (i=1;i<=n;i ) //构建初始序列
enQueue(q,i);
printf("报数出列顺序:");
while (!QueueEmpty(q)) //队列不空循环
{
deQueue(q,e); //出队一个元素e
printf("%d ",e); //输出元素编号
if (!QueueEmpty(q)) //队列不空
{
deQueue(q,e); //出队一个元素e
enQueue(q,e); //将刚出列的元素进队
}
}
printf("n");
DestroyQueue(q); //销毁队列q
}
int main()
{
int i,n=8;
printf("初始序列:");
for (i=1;i<=n;i )
printf("%d ",i);
printf("n");
number(n);
return 1;
}
求解迷宫
习题板块
废江博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 转载请注明原文链接:队列(链式存储结构)