链式结构
1.进队
2.出队
3.判断为空
4.个数
5.初始化
#include<iostream>
using namespace std;
struct node
{
int data;
node *next;
};
typedef struct
{
node *front;
node *rear;
}Queue;
void init(Queue *&s)
{
s=new Queue;
s->front=s->rear=NULL;
}//初始化
bool empty(Queue *&s)
{
return(s->rear==NULL);
}
void push(Queue *&s,int num)
{
node *p;
p=new node;
p->data=num;
p->next=NULL;
if(s->rear==NULL)
{
s->rear=s->front=p;//如果为空则头指针尾指针都赋值
}
else
{
s->rear->next=p;
s->rear=p; //尾部赋值
}
}
int dequeue(Queue *&s)
{
node *p;
int tmp;
if(s->rear==NULL)
{
s->rear =s->front =NULL;//都回归刚开始的情况
return -1;
}
else
{
p=s->front;
s->front=s->front->next;
tmp=p->data;
delete p;//删除
}
return tmp;
}
int main()
{
int n;
Queue *p;
init(p);
cin>>n;
for(int i=0;i<n;++i)
{
int t;
cin>>t;
push(p,t);
}
for(int i=0;i<n;i++)
{
printf("%d\n",dequeue(p));
}
return 0;
}
数组形式
1.进队
2.出队
3.判断为空
4.个数
5.初始化
6.队满
#include<iostream>
using namespace std;
const int N=10000;
struct node
{
int data[N];
int front,rear;
};
void init(node *&s)
{
s=new node;
s->front=s->rear=0;
}
bool empty(node *&s)
{
return s->front=s->rear;
}
void push(node *&s,int num)
{
s->rear=(s->rear+1)%N;
s->data[s->rear]=num;
}
int dequeue(node *&s)
{
s->front=(s->front+1)%N;
return s->data[s->front];
}
int main()
{
int n;
node *p;
init(p);
cin>>n;
for(int i=0;i<n;i++)
{
int t;
cin>>t;
push(p,t);
}
for(int i=0;i<n;i++)
{
printf("%d\n",dequeue(p));
}
return 0;
}
迷宫问题(最短路径)
#include<iostream>
#include<queue>
#include<string.h>
#include<cmath>
using namespace std;
typedef pair<int, int> P;
const int N = 100;
const int INF = 10000;
queue<P> q, p;
int dis[N][N], w[N][N], a[N][N];
int d[4][2] = { 0,1,1,0,0,-1,-1,0 };
int n = 8;
int bfs()//反向寻找
{
memset(dis, 10000, sizeof(dis));
p.push({ 7,7});
dis[7][7] = 0;
while (!p.empty())
{
P r;
r = p.front(); p.pop();
int x, y;
x = r.first;
y = r.second;
//cout << x << " " << y << '\n';
if (x == 0 && y == 0)
{
return 1;
}
for (int i = 0; i < 4; ++i)
{
int xx, yy;
xx = x + d[i][0];
yy = y + d[i][1];
; if (xx >= n || xx < 0 || yy < 0 || yy>=n||a[xx][yy])continue;
int t = dis[x][y] + 1;
dis[xx][yy] = min(t, dis[xx][yy]);
a[xx][yy] = 2;
//cout<<xx<<" "<<yy<<'\n';
p.push({ xx,yy });
}
}
return 0;
}
void print1()
{
printf("%d %d\n", 0, 0);
int x = 0, y = 0;
while (x < 7 || y < 7)
{
for (int i = 0; i < 4; i++)
{
int xx, yy;
xx = x + d[i][0];
yy = y + d[i][1];
//cout << dis[xx][yy]<<" "<< xx<<" "<<yy << '\n';
if (dis[xx][yy] == dis[x][y]-1)
{
printf("%d %d\n", xx, yy);
x = xx, y = yy;
break;
}
}
}
}
int main()
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> a[i][j];
}
}
//cout << bfs() << '\n';
if (bfs())print1();
return 0;
}
样例
0 0 1 0 0 0 1 0
0 1 1 1 0 0 0 0
0 1 0 0 0 1 0 0
0 0 0 0 0 0 0 0
0 0 1 0 0 0 1 0
0 0 0 0 1 1 0 0
0 0 0 1 0 0 0 0
0 1 1 1 0 1 1 0
输出
0 0
1 0
2 0
3 0
3 1
3 2
3 3
3 4
3 5
3 6
3 7
4 7
5 7
6 7
7 7