您的位置:首页 > 编程语言 > C语言/C++

顺序队列和链式队列的实现

2016-02-28 20:49 295 查看
队列是一种常用的数据结构,它跟栈一样,操作都受到限制,队列只允许从一端进数据,另一端出数据。队列跟栈不同,栈是一种“后进先出”的模式,而队列是一种“先进先出”的操作模式。就好比日常排队一样,先排队的先出,后排队的后出。例如,进入队列的顺序是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 队列