队列(关于实现)

队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

一.链表的实现(链表相关知识在之前写过)

#include<stdio.h>
#include<string.h>
typedef struct{
	int data;
	struct Node* prev;
	struct Node* next;
}Node;

	Node* queuehead=NULL,*queuetail=NULL;
	int  queuelen=0;

	Node* queuecreateNode(int dat){
	Node* ptr=malloc(sizeof(Node));
	if(ptr==NULL){
		exit(1);}
	ptr->data=dat;
	ptr->next=NULL;
	ptr->prev=NULL;
	return ptr;
	}

	Node* queueget(int index){
		Node* ptr;
		int i;
		if(index<0||index>=queuelen){
			printf("index is illegal");
		    exit(1);}
		if(index<queuelen/2){
			ptr=queuehead;
			for(i=0;i<index;i++){
			ptr=ptr->next;}
			}else{
			ptr=queuetail;
			for(i=0;i<index-queuelen-1;i++){
			ptr=ptr->prev;}
			}
			return ptr;
		}
void queueaddlast(int dat){
	Node *ptr=queuecreateNode(dat);
	if(queuelen==0){
		queuehead=ptr;
		queuetail=ptr;
	}else{
		queuetail->next=ptr;
		ptr->prev=queuetail;
		queuetail=ptr;
	}
	queuelen++;
}

void queuedelete(int index){
	Node* temp=queuehead;
	Node* curptr=NULL,* prevptr=NULL,*nextptr=NULL;
	if(index<0||index>=queuelen){
				printf("index is illegal");
			    exit(1);}
	if(index==0){
		queuehead=queuehead->next;
		free(temp);}
	else{
		prevptr=queueget(index-1);
		curptr=prevptr->next;
		nextptr=curptr->next;
		if(nextptr=NULL){
			queuetail=prevptr;
		}
		prevptr->next=nextptr;
		nextptr->prev=prevptr;
		free(curptr);}
		queuelen--;
}

void queuetravel(){
	int i=queuelen;
	Node *ptr=queuehead;
	int len=queuelen;
	while(len--){
		printf("add:%x, %d, next:%x, queueHead:%x, queueTail:%x \n", ptr, ptr->data, ptr->next, queuehead, queuetail);
		ptr=ptr->next;
	}
}

void queuepush(int dat){
	queueaddlast(dat);
}

int queuepop(){
	int dat=queueget(0)->data;
	queuedelete(0);
	return dat;
}

int queuetop(){
	return queueget(0);
}

int queuesize(){
	return queuelen;
}

用链表实现的队列实现报数操作

n个人围成一圈,数到3的人退出

void main(){
    int i = 1, dat;
    for(;i<=30;i++){
           queuepush(i);//先将1到30入队
       }
       
       queuetravel();
       printf("len:%d\n", queuesize());
      
       while(queuelen){
       	dat=queuepop();//出队        
        if((dat%3)!=0){//判断出队的数书否能被三整除不能就打印出来
        printf("%d\n",dat);
}
       }
}

实现加打印:
**len:30
1
2
4
5
7
8
10
11
13
14
16
17
19
20
22
23
25
26
28
29

二.用数组实现队列

1.定义

#include<stdio.h>
#define queue_size 30
int circlequeue[queue_size];int queuestart=0;
int queueend=-1;
int queuelen=0;

2.查找

int queueget(int index){
 if(index<0||index>=queuelen){
  printf("error");
  exit(1);
 }
 return circlequeue[index];
}

3.打印

void queuetravel(){
 int i=queuelen,j=queuestart,dat;
 while(i--){
  dat=circlequeue[j++];
  if(j==queue_size){
   j=0;
  }
  printf("add:%x , %d",&circlequeue[j],dat);
 }
}

4.入队

void queuepush(int dat){
 if(queuelen==queue_size){
  printf("queue is overflow\n");
  exit(1);
  }
  ++queueend;
  queueend%=queue_size;
  circlequeue[queueend]=dat;
  queuelen++;
}


5.入队

int queuepop(){
 int dat;
 if(queuelen==0){
  printf("queue is empty!\n");
  exit(1);
 }
 dat=circlequeue[queuestart];
 queuestart++;
 queuestart%=queue_size;
 queuelen--;
 return dat;
}


实现上述报数

void main(){
    int i = 1, dat;
    for(;i<=30;i++){
           queuepush(i);//先将1到30入队
       }       while(queuelen){
       dat=queuepop();//出队
       if((dat%3)!=0){//判断出队的数书否能被三整除不能就打印出来
       printf("%d\n",dat);}
       }
}

打印

1
2
4
5
7
8
10
11
13
14
16
17
19
20
22
23
25
26
28
29

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值