队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(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