初级队列
入队
先判断队列是否为空 为空创建节点头结点和尾节点都指向该节点。
如果不为空 尾节点指向新节点 尾结点变为新节点
void push(Q *q, int data)
{
N *pnew = CreateNode(data);
if (q->head == NULL)
{
q->head = q->tail = pnew;
}
q->tail->next = pnew;
q->tail = pnew;
}
出队
头结点往后移,是不是跟删链表的中间结点操作相似呢?
int pop(Q *q)
{
N *temp = q->head;
q->head = q->head->next;
int a = temp->data;
free(temp);
return a;
}
查
遍历一遍
void Prt(Q *q)
{
N *pmove = q->head;
while (pmove)
{
cout << pmove->data << " ";
pmove = pmove->next;
}
}
循环队列
我以int下标front和rear来表示首尾
循环队列有三个点需要明白:
1.判断是否满
rear+1)%MAXSIZE==front
2.判断是否空
rear=front
3.算长度
rear-front+MAXISZE)%MAXISZE
#include <bits/stdc++.h>
using namespace std;
const int N = 1024;
typedef struct Queue
{
int front;
int rear;
int data[N];
} Q;
bool isfull(Q *q)
{
return (q->rear + 1) % N == q->front;
}
bool isEmpty(Q *q)
{
return q->front = q->rear;
}
Q *createQ()
{
Q *pnew = (Q *)malloc(sizeof(Q));
pnew->front = pnew->rear = 0;
return pnew;
}
void push(Q *q, int data)
{
if (!isfull(q))
{
q->data[q->rear] = data;
q->rear = (q->rear + 1) % N;
}
}
int Pop(Q *q)
{
if (!isEmpty(q))
{
int t = q->data[q->front];
q->front = (q->front + 1) % N;
return t;
}
}
int main()
{
int n;
n = 5;
Q *q = createQ();
while (n--)
{
cout << n;
push(q, n);
}
while (!isEmpty(q))
{
cout << Pop(q);
}
}