一、數組實現:
用數組模擬隊列給定一個數組長度,爲隊列長度
用下標做指定頭尾位置,pri爲頭,bak爲尾
爲了不浪費空間長度:
pri=bak時隊列爲空,即:
(bak+1)% MAXSIZE = pri 時: 隊列爲滿,即:
bak指向的位置始終爲空。當然也可以指向最後一個元素,但是我習慣於這種
#include<cstdio>
#include<iostream>
#include<cstdlib>
#define MAXSIZE 10000
using namespace std;
typedef struct Que_line{
int *Element;
int pri;
int bak;
}Que_line;
void Creat_Que(Que_line* &Que)
{
Que = (Que_line *)malloc(sizeof(Que_line));
Que->Element = (int *)malloc(MAXSIZE * sizeof(int));
Que->pri = Que->bak = 0;
return ;
}
void In_Que(Que_line* Que, int e)
{
if((Que->bak+1) % MAXSIZE == Que->pri)
{
printf("隊列已經滿了\n");
return ;
}
Que->Element[Que->bak] = e;
Que->bak = (Que->bak+1) % MAXSIZE;
return ;
}
void Out_Que(Que_line* Que, int &e)
{
if(Que->pri == Que->bak)
{
printf("隊列已經爲空\n");
return ;
}
e = Que->Element[Que->pri];
Que->pri = (Que->pri+1) % MAXSIZE;
return ;
}
int main()
{
int x, n;
Que_line *Que;
Creat_Que(Que);
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &x);
In_Que(Que, x);
}
for(int i = 0; i < n; i++)
{
Out_Que(Que, x);
printf("%d%c", x, i == n-1 ? '\n' : ' ');
}
if(Que->pri == Que->bak)
printf("隊列爲空\n");
else
printf("出錯\n");
return 0;
}
二、鏈表實現:
鏈表結構:
typedef struct Que_link{
int data;
struct Que_link *next;
}Que_link, *Que_link_idx;
自定義鏈表頭部:typedef struct Que_link_h{
Que_link_idx pri; ///指向鏈表的頭節點
Que_link_idx bak; ///指向鏈表的尾節點
}Que_link_h;
插入時在尾節點處插入,刪除時在頭結點處刪除
插入時:
如果插入的是第一個元素則應使 自定義的頭部的頭指針和尾指針都指向第一個元素;
如果不是就將這個元素接到鏈表尾部,並它的next=NULL(表示尾部),而且要 自定義的鏈表頭部 尾指針後移一下。
刪除時:
如果刪除的時最後一個元素,則應該讓 自定義的頭指針和尾指針 指向尾部,表示隊列爲爲空。
如果不是,就讓頭指針後移一下就ok了, 記得將刪除的節點free()哦,節省空間。
接下來看完整代碼:
#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct Que_link{
int data;
struct Que_link *next;
}Que_link, *Que_link_idx;
typedef struct Que_link_h{
Que_link_idx pri;
Que_link_idx bak;
}Que_link_h;
void Creat_Que_link(Que_link_h* &Que)
{
Que = (Que_link_h *)malloc(sizeof(Que_link_h));
Que->pri = Que->bak = NULL;
return ;
}
void In_Que_link(Que_link_h* Que, int e)
{
Que_link_idx p;
p = (Que_link_idx)malloc(sizeof(Que_link));
p->data = e;
///進入第一個元素與進入第i(i!=1)個元素操作不同:
p->next = NULL;
if(Que->bak == NULL) ///進入第一個元素時首位指針都要指向該位置
Que->bak = Que->pri = p;
else ///進入第i(i!=1)個元素則需要先接到鏈上,然後爲指針後移
{
Que->bak->next = p;
Que->bak = p;
}
return ;
}
void Out_Que_link(Que_link_h* Que, int &e)
{
if(Que->pri == NULL)
{
printf("隊列已經爲空\n");
return ;
}
///刪除最後一個元素時與刪除第i(i!=1)個元素不同
Que_link_idx p; ///刪除第i(i != 1)個元素只需要頭指針後移
p = (Que_link_idx)malloc(sizeof(Que_link));
p = Que->pri;
Que->pri = Que->pri->next;
if(Que->bak == p) ///刪除最後一個元素還需要尾指針指空NULL
Que->bak = NULL;
e = p->data;
free(p);
return ;
}
int main()
{
int n, x;
Que_link_h* Que;
Creat_Que_link(Que);
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &x);
In_Que_link(Que, x);
}
for(int i = 0; i < n; i++)
{
Out_Que_link(Que, x);
printf("%d ", x);
}
printf("\n\n\n\n");
if(Que->pri == NULL)
printf("隊列爲空\n");
else
printf("操作出錯\n");
return 0;
}