队列是一种常用的数据结构,它跟栈一样,操作都受到限制,队列只允许从一端进数据,另一端出数据。队列跟栈不同,栈是一种“后进先出”的模式,而队列是一种“先进先出”的操作模式。就好比日常排队一样,先排队的先出,后排队的后出。例如,进入队列的顺序是1,2,3,4,5则出队列的顺序是1,2,3,4,5(只考虑一次性出列的情况)。
队列也分顺序队列和链式队列,跟顺序栈和链表栈一样,顺序队列同样是基于数组实现,链式队列则是基于链表实现。
顺序队列:
//顺序队列
#include#define SIZE 10typedef struct Queue{int data[SIZE];int front;int tail;}Queue;//初始化队列void init_queue(Queue* qu){qu->front=0;qu->tail=-1;}//判断队列是否为满int is_queue_empty(Queue* qu){if(qu->tail==-1){return 1;}return 0;}//判断队列是否为满int is_queue_full(Queue* qu){if(qu->tail==SIZE-1){return 1;}return 0;}//获取队首值int get_topvalue(Queue* qu){if(is_queue_empty(qu)){printf("Queue is empty!\n");return -1;}return qu->data[qu->front];}//进队列void in_queue(Queue* qu,int _data){if(is_queue_full(qu)){printf("Queue is full!\n");return ;}qu->tail++;qu->data[qu->tail]=_data;}int out_queue(Queue* qu){if(is_queue_empty(qu)){printf("Queue is empty!\n");return -1;}int ret_value=qu->data[qu->front];int i;for(i=0;i tail;i++){qu->data[i]=qu->data[i+1];}qu->tail--;return ret_value;}//打印队列内的元素void print_queue(Queue* qu){int i;for(i=0;i tail+1;i++){printf("%d\t",qu->data[i]);}printf("\n");}int main(int argc, char const *argv[]){Queue qu;init_queue(&qu);in_queue(&qu,1);in_queue(&qu,23);in_queue(&qu,5);in_queue(&qu,3);in_queue(&qu,6);printf("get_topvalue:%d\n",get_topvalue(&qu));//out_queue(&qu);//print_queue(&qu);int i;for(i=0;i<7;i++){printf("%d\t",out_queue(&qu));}printf("\n");return 0;}
链式队列:
//链式队列#include#include typedef struct Node{ int data; struct Node* next;}Node;typedef struct Queue{ Node* front; Node* tail;}Queue;//初始化队列void init_queue(Queue* qu){ qu->front=NULL; qu->tail=NULL;}//判断队列是否为空int is_queue_empty(Queue* qu){ if(qu->front==NULL) { return 1; } return 0;}//获取队首值int get_front_value(Queue* qu){ if(is_queue_empty(qu)) { printf("Queue is empty!\n"); return -1; } return qu->front->data;}//入列void in_queue(Queue* qu,int _data){ Node* newnode=(Node*)malloc(1*sizeof(Node)); newnode->data=_data; newnode->next=NULL; if(qu->front==NULL && qu->tail==NULL) { qu->front=newnode; qu->tail=newnode; } else { qu->tail->next=newnode; qu->tail=newnode; }}//出列void out_queue(Queue* qu){ if(is_queue_empty(qu)) { printf("Queue is empty!\n"); return; } Node* temp=qu->front; qu->front=qu->front->next; if(qu->front==NULL) { qu->tail=NULL; } free(temp); temp=NULL;}//打印队列中的值void print_queue(Queue* qu){ Node* curr=qu->front; while(curr) { printf("%d\t",curr->data); curr=curr->next; } printf("\n");}int main(int argc, char const *argv[]){ Queue qu; init_queue(&qu); int i; for(i=0;i<10;i++) { in_queue(&qu,i*2); } print_queue(&qu); printf("get_front_value:%d\n",get_front_value(&qu)); out_queue(&qu); print_queue(&qu); printf("get_front_value:%d\n",get_front_value(&qu)); return 0;}