=========================================================================================================================
//用链表实现队列
#include<stdio.h>
#include<assert.h>
#include<strings.h>
#include<stdlib.h>
#define QUEUE_TYPE int
typedef struct person{
int num;
struct person *next;
}PER;
void creat(void);//我们初始化,用malloc分配给tail指向一个空的结构体,目的是用于结束的判断
void destory(void);//释放creat给tail分配的空间
void insert(QUEUE_TYPE value);//入队
QUEUE_TYPE frist(void); //遍历队头元素,并不对他进行操做
void delete(void);//出队
int is_empty(void);//判断是否是空队
static PER *head=NULL;
static PER *tail=NULL;
static PER *tail_pre=NULL;//用来指向倒数第二个结点,真正有数据的结点
int main(){
int i,j=1,k;
creat();
printf("请输入入队的个数:\n");
scanf("%d",&i);
while(i){
printf("请输入第%d个数为:\n",j++);
scanf("%d",&k);
insert(k);
i--;
}
/*
for(i=1;i<=10;i++){
insert(i);
}
*/
printf("出队内容为:\n");
while(!is_empty()){
printf("%d\t",frist());
delete();
}
destory();
return 0;
}
void destory(void){
free(tail);
}
void creat(void){
tail=(PER *)malloc(sizeof(PER));
Assert(tail != NULL);//断言分配内存成功
bzero(tail,sizeof(PER));
tail->next = NULL;
}
void insert(QUEUE_TYPE value){
PER *tmp=NULL;
tmp = (PER *)malloc(sizeof(PER));
Assert(tmp != NULL);
bzero(tmp,sizeof(PER));
tmp->num = value;
if(head==NULL){
head = tail_pre = tmp;
}else{
tail_pre->next = tmp;
tail_pre = tail_pre->next;//tail_pre使终指向最后一个装有有效数据的结点
}
tail_pre->next = tail; //把最后一个元素与次最后元素边起来
}
QUEUE_TYPE frist(void){
assert(!is_empty());
return head->num;
}
void delete(void){
assert(!is_empty());
PER *tmp = head;
head = head->next;
free(tmp);
}
int is_empty(void){
return head == tail;
}
================================================================================================================================
//用数组实现队列
#include<stdio.h>
#include<assert.h>
#include<strings.h>
#include<stdlib.h>
//用宏代替一些与队列有关系的参数,容易实现整体的改动
#define QUEUE_TYPE int //定义队列中存放值的类型
#define QUEUE_SIZE 30 //队列的大小
#define ARRAY_SIZE (QUEUE_SIZE+1) //数组中有效值为队列大小减一,有一个不用,用来标识满或空
//定义全局变量
static QUEUE_TYPE queue[ ARRAY_SIZE ]; //定义全局数组
static size_t front=1; //队头的下标
static size_t rear=0; //队尾的下标
//声明子函数
void insert(QUEUE_TYPE value);//入队
QUEUE_TYPE frist(void); //遍历队头元素,并不对他进行操做
void delete(void);//出队
int is_empty(void);//判断是否是空队
int is_full(void);//判断队是否满了?
int main(){
int i;
for(i=1;i<=10;i++){
insert(i);
}
printf("出队内容为:\n");
while(!is_empty()){
printf("%d\t",frist());
delete();
}
return 0;
}
void insert(QUEUE_TYPE value){
assert(!is_full());
rear = (rear+1)%ARRAY_SIZE;
queue[rear] = value; //rear队尾的下标
}
QUEUE_TYPE frist(void){
assert(!is_empty());
return queue[front]; //front 代表队头的下标
}
void delete(void){
assert(!is_empty());
front=(front+1)%ARRAY_SIZE;
}
int is_empty(void){
return (rear+1)%QUEUE_SIZE==front;//画画图就清楚了
}
int is_full(void){
return (rear+2)%QUEUE_SIZE==front;//这个也是!
}
//用sum来代表队列中剩余的数据元素,当sum等于0时,这个队列就为空了;当sum等于N时就表示队列满了。
#include <stdio.h>
#define N 6
int f=0,r=0;
int a[N];
int sum=0;
void indui(int num)
{
r=r%N;
if(sum<N )
{
a[r]=num;
sum++;
r++;
}
else
{printf("dui man \n");}
}
int outdui(void)
{ int out;
if(sum==0)
{
printf("dui NULL\n");
}
else
{
f=f%N;
sum--;
out=a[f];
f++;
}
return out;
}
int main()
{
int i;
indui(1);
indui(2);
indui(3);
indui(4);
outdui();
indui(5);
indui(6);
outdui();
indui(7);
for(i=0;sum!=0;i++)
printf("%d\t",outdui());
printf("\n");
return 0;
}