队列是一种常用的数据结构,它跟栈一样,操作都受到限制,队列只允许从一端进数据,另一端出数据。队列跟栈不同,栈是一种“后进先出”的模式,而队列是一种“先进先出”的操作模式。就好比日常排队一样,先排队的先出,后排队的后出。例如,进入队列的顺序是1,2,3,4,5则出队列的顺序是1,2,3,4,5(只考虑一次性出列的情况)。
队列也分顺序队列和链式队列,跟顺序栈和链表栈一样,顺序队列同样是基于数组实现,链式队列则是基于链表实现。
顺序队列:
//顺序队列
#include <stdio.h> #define SIZE 10 typedef 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<qu->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<qu->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 <stdio.h> #include <stdlib.h> 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; }
时间: 2024-10-16 20:43:33