首先是顺序队
#include<stdio.h>
#include<stdlib.h>
#define maxSize 100
typedef struct //定义顺序队结构体
{
int data[maxSize];
int front, rear;
}SqQueue;
void InitQueue(SqQueue * &q)//初始化顺序队 initiate 英[ɪˈnɪʃieɪt] 开始, 创始,开辟
{
q = (SqQueue*)malloc(sizeof(SqQueue));
q->front =q->rear= -1;
}
void DestroyQueue(SqQueue * &q)//销毁顺序队 destroy [dɪˈstrɔɪ]杀死; 破坏,摧毁;
{
free(q);
}
bool QueueEmpty(SqQueue * &q)//判断是否为空 empty[ˈempti]空的,空虚的,空洞的;
{
return(q->front==q->rear);
}
bool enQueue(SqQueue *&q, int e)//进队列
{
if (q->rear == maxSize - 1)
return false;
q->rear++;
q->data[q->rear] = e;
return true;
}
bool deQueue(SqQueue *&q, int &e)//出队列
{
if (q->front == q->rear)
return false;
q->front++;
e = q->data[q->front];
return true;
}
由于顺序队指针front和指针rear都是累加增1的,会出现假溢出的情况,故出现了循环队列。
#include<stdio.h>
#include<stdlib.h>
#define maxSize 100
typedef struct //定义顺序队结构体
{
int data[maxSize];
int front, rear;
}SqQueue;
void InitQueue(SqQueue * &q)//初始化顺序队 initiate 英[ɪˈnɪʃieɪt] 开始, 创始,开辟
{
q = (SqQueue*)malloc(sizeof(SqQueue));
q->front =q->rear= 0;
}
void DestroyQueue(SqQueue * &q)//销毁顺序队 destroy [dɪˈstrɔɪ]杀死; 破坏,摧毁;
{
free(q);
}
bool QueueEmpty(SqQueue * &q)//判断是否为空 empty[ˈempti]空的,空虚的,空洞的;
{
return(q->front==q->rear);
}
bool enQueue(SqQueue *&q, int 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, int &e)//出队列
{
if (q->front == q->rear)
return false;
q->front = (q->front + 1) % maxSize;
e = q->data[q->front];
return true;
}
也可以只使用front指针,并用队列中元素的个数来代替队尾指针:
#include<stdio.h>
#include<stdlib.h>
#define maxSize 100
typedef struct //定义顺序队结构体
{
int data[maxSize];
int front, count;
}SqQueue;
void InitQueue(SqQueue * &q)//初始化顺序队 initiate 英[ɪˈnɪʃieɪt] 开始, 创始,开辟
{
q = (SqQueue*)malloc(sizeof(SqQueue));
q->front = q->count = 0;
}
void DestroyQueue(SqQueue * &q)//销毁顺序队 destroy [dɪˈstrɔɪ]杀死; 破坏,摧毁;
{
free(q);
}
bool QueueEmpty(SqQueue * &q)//判断是否为空 empty[ˈempti]空的,空虚的,空洞的;
{
return(q->count==0);
}
bool enQueue(SqQueue *&q, int e)//进队列
{
if (q->count==maxSize)
return false;
q->count++;
int i = (q->front + q->count)%maxSize;
q->data[i] = e;
return true;
}
bool deQueue(SqQueue *&q, int &e)//出队列
{
if (q->count==0)
return false;
q->front = (q->front + 1) % maxSize;
e = q->data[q->front];
q->count--;
return true;
}
队列也可以使用链式存储结构:
#include<stdio.h>
#include<stdlib.h>
#define maxSize 100
typedef struct qnode
{
int data;
struct qnode *next;
}DataNode;
typedef struct
{
DataNode * front;
DataNode * rear;
}LinkQuNode;
void InitQueue(LinkQuNode * &q)//初始化 initiate 英[ɪˈnɪʃieɪt] 开始, 创始,开辟
{
q = (LinkQuNode*)malloc(sizeof(LinkQuNode));
q->front = q->rear = NULL;
}
void DestroyQueue(LinkQuNode* &q)//销毁 destroy [dɪˈstrɔɪ]杀死; 破坏,摧毁;
{
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 QueueEmpty(LinkQuNode * &q)//判断是否为空 empty[ˈempti]空的,空虚的,空洞的;
{
return(q->front==0);
}
bool enQueue(LinkQuNode *&q, int e)//进队列
{
DataNode * p = (DataNode*)malloc(sizeof(DataNode));
DataNode * o = q->rear;
p->next = NULL; p->data = e;
if (q->rear == NULL)
q->front = q->rear = p;
else
{
q->rear->next = p;
q->rear = p;
}return true;
}
bool deQueue(LinkQuNode *&q, int &e)//出队列
{
if (q->rear == NULL)
return false;
e = q->front->data;
DataNode *p = q->front;
if (q->front == q->rear)
q->front = q->rear = NULL;
else
q->front = q->front->next;
free(p);
}
int main()
{
LinkQuNode *q;
int e = 0;
InitQueue(q);
enQueue(q, 1);
enQueue(q, 2);
enQueue(q, 3);
deQueue(q, e);
printf("出对元素为%d\n", e);
deQueue(q, e);
printf("出对元素为%d\n", e);
system("pause");
return 0;
}
照着书上敲了一个习题
实现对一串数,先出队一个打印出来,再出队一个,把该元素放到队列最后,直至队列为空。虽然很简单,,但是自己敲得时候遇到了一些小问题,,找一下毛病。
出现问题的原因:
1、当然是不细心了。。
2、比如说当数组作为形参传入函数时,哪怕你的形参是a[],到了函数内部,他只是把它当做一个指针,你要是想进行a[1],编译器不会知道你的意思,所以正确的做法是,直接写出地址,再 *(a+i),即可。
在这里插入代码片
```void number(int *a, int n)
{
int e;
LinkQuNode *q;
InitQueue(q);
for (int i = 0; i < n; i++)
{
enQueue(q, *(a + i));//注意此处不可为a[n]
}
while (!QueueEmpty(q))
{
deQueue(q, e); printf("编号%d出队\n", e);
if(!QueueEmpty(q))
{
deQueue(q, e);
enQueue(q, e);
}
}
}
int main()
{
int a[] = { 1,2,3,4,5,6,7,8 };
number(a,8);
system("pause");
return 0;
}