数据结构——顺序队列与链式队列的实现-2

简介: 数据结构——顺序队列与链式队列的实现

数据结构——顺序队列与链式队列的实现-1

https://developer.aliyun.com/article/1507982


6、出队

C语言实现如下所示:

bool out_seqqueue(seq_pqueue q,datatype *D)
{
  //判断队列是否空
  if(is_empty_seqqueue(q)){
    printf("队列已空!\n");
    return false;
  }
 
  //出队
  q->front=(q->front+1)%MAXSIZE;
  *D=q->data[q->front];
 
  return true;
}


7、打印队列

C语言实现如下所示:

void show_seqqueue(seq_pqueue q)
{
  int i;
  if(is_empty_seqqueue(q))
    return;
  //非空时,从对头打印到队尾
  for(i=(q->front+1)%MAXSIZE;i!=(q->rear+1)%MAXSIZE;i=(i+1)%MAXSIZE)
  {
    printf("%d\t",q->data[i]);
  }
  printf("\n");
}


8、队列的顺序表实现源码

seqqueue.h

#ifndef __SEQQUEUE_H__
#define __SEQQUEUE_H__
 
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
 
#define MAXSIZE 10
typedef int datatype;
 
typedef struct seqqueue{
  datatype data[MAXSIZE];
  int front,rear;
}seq_queue,*seq_pqueue;
 
extern seq_pqueue init1_seqqueue(void);
extern void init_seqqueue(seq_pqueue *Q);
extern bool is_full_seqqueue(seq_pqueue q);
extern bool is_empty_seqqueue(seq_pqueue q);
extern bool in_seqqueue(datatype data,seq_pqueue q);
extern bool out_seqqueue(seq_pqueue q,datatype *D);
extern void show_seqqueue(seq_pqueue q);
 
#endif


seqqueue.c

#include "seqqueue.h"
 
seq_pqueue init1_seqqueue(void)
{
  seq_pqueue q;
  q=(seq_pqueue)malloc(sizeof(seq_queue));
  if(q==NULL)
  {
    perror("malloc");
    exit(-1);
  }
  q->front=q->rear=MAXSIZE-1;
 
  return q;
}
 
void init_seqqueue(seq_pqueue *Q)
{
  *Q=(seq_pqueue)malloc(sizeof(seq_queue));
  if((*Q)==NULL)
  {
    perror("malloc");
    exit(-1);
  }
  (*Q)->front=(*Q)->rear=MAXSIZE-1;
  
  return;
}
 
//判断队列是否满
bool is_full_seqqueue(seq_pqueue q)
{
  if((q->rear+1)%MAXSIZE == q->front)
    return true;
  else
    return false;
}
 
//入队
bool in_seqqueue(datatype data,seq_pqueue q)
{
  //判断队列是否满
  if(is_full_seqqueue(q)){
    printf("队列已满!\n");
    return false;
  }
 
  //入队
  q->rear=(q->rear+1)%MAXSIZE;
  q->data[q->rear]=data;
  return true;
}
 
//判断队列是否空
bool is_empty_seqqueue(seq_pqueue q)
{
  if(q->rear == q->front)
    return true;
  else
    return false;
}
 
//出队
bool out_seqqueue(seq_pqueue q,datatype *D)
{
  //判断队列是否空
  if(is_empty_seqqueue(q)){
    printf("队列已空!\n");
    return false;
  }
 
  //出队
  q->front=(q->front+1)%MAXSIZE;
  *D=q->data[q->front];
 
  return true;
}
 
void show_seqqueue(seq_pqueue q)
{
  int i;
  if(is_empty_seqqueue(q))
    return;
  //非空时,从对头打印到队尾
  for(i=(q->front+1)%MAXSIZE;i!=(q->rear+1)%MAXSIZE;i=(i+1)%MAXSIZE)
  {
    printf("%d\t",q->data[i]);
  }
  printf("\n");
}


test.c

#include "seqqueue.h"
/* 用循环队列实现如下功能:
 * 用户从键盘输入整数,程序将其入队;
 * 用户从键盘输入字母,程序将队头元素出队;
 * 并在每一次出队和入队之后打印队列元素。
 */
int main(int argc, const char *argv[])
{
  seq_pqueue q;
  datatype data,t,ret;
  
  init_seqqueue(&q);
 
  while(1)
  {
    printf("请输入一个整数或字符:");
    ret=scanf("%d",&data);
    
    //输入整数时,入队
    if(ret == 1)
    {
      if(in_seqqueue(data,q))
        show_seqqueue(q);
    }
    else
    {
      //输入为字符时
      if(out_seqqueue(q,&t))
      {
        printf("out:%d\n",t);
        show_seqqueue(q);
      }
      //清空输入缓冲区
      while(getchar()!='\n');
    }
  }
  return 0;
}


Makefile

CC = gcc
CFLAGS = -o0 -g -Wall
 
SRC=seqqueue.c test.c
OBJS=test
 
$(OBJS):$(SRC)
  $(CC) $(CFLAGS) -o $@ $^
 
.PHONY:clean
clean:
  rm -rf $(OBJS) *.o
  • "-o0"表示优化级别为0,即关闭优化。这将导致生成的可执行文件较大,但是可以方便地进行调试。
  • "-g"表示生成调试信息,以便在调试程序时可以查看变量的值、函数的调用栈等信息。
  • "-Wall"表示启用所有警告,编译器将会显示所有可能的警告信息,帮助开发人员发现潜在的问题。


编译结果测试:


5b637949016014d18b1a1a44c6464e4b_886a20dd8a924d75a7c5bdd8bc211f59.png


四、队列的链表实现

1、数据结构定义

对于链表,在进行 队列的定义 之前,我们需要考虑以下几个点:

 1)队列数据的存储方式,以及队列数据的数据类型;

 2)队列的大小;

 3)队首指针;

 4)队尾指针;


我们可以定义一个 队列结构体,C语言实现如下所示:

typedef int datatype;
 
typedef struct linkqueuenode{ 
  datatype data;                    /* 数据域 */
  struct linkqueuenode *next;       /* 指针域 */
}linkqueue_node,*linkqueue_pnode;
 
typedef struct linkqueue{
  linkqueue_pnode front,rear;       /* 链队列指针 */
}link_queue,*link_pqueue;


2、初始化创造队列

C语言实现如下所示:

void init_linkqueue(link_pqueue *Q)
{
  //申请front和rear的空间
  *Q=(link_pqueue)malloc(sizeof(link_queue));
  if((*Q)==NULL)
  {
    perror("malloc");
    exit(-1);
  }
  //申请头结点空间
  (*Q)->front=(linkqueue_pnode)malloc(sizeof(linkqueue_node));
  if((*Q)->front==NULL)
  {
    perror("malloc");
    exit(-1) ;
  }
 
  (*Q)->front->next=NULL;
  (*Q)->rear=(*Q)->front;
 
  return;
}


3、判断队列是否空

C语言实现如下所示:

bool is_empty_linkqueue(link_pqueue q)
{
  if(q->rear == q->front)
    return true;
  else
    return false;
}


4、入队

C语言实现如下所示:

bool in_linkqueue(datatype data,link_pqueue q)
{
  linkqueue_pnode  new;
 
  //申请数据结点空间
  new=(linkqueue_pnode)malloc(sizeof(linkqueue_node));
  if(new==NULL)
  {
    puts("入队失败!");
    return false;
  }
  //将数据存储在申请的空间
  new->data=data;
  
  //将new指向的结点插入到链式队列中
  new->next=q->rear->next;
  q->rear->next=new;
  
  //让rear指针指向新的队尾结点
  q->rear=q->rear->next;
 
  return true;
}


5、出队

C语言实现如下所示:

bool out_linkqueue(link_pqueue q,datatype *D)
{
  linkqueue_pnode t;
  //判断队列是否空
  if(is_empty_linkqueue(q)){
    printf("队列已空!\n");
    return false;
  }
 
  //出队
  t=q->front;
  q->front =q->front->next;
  *D=q->front->data;
  free(t);
 
  return true;
}


6、打印队列

C语言实现如下所示:

void show_linkqueue(link_pqueue q)
{
  linkqueue_pnode p;
  if(is_empty_linkqueue(q))
    return;
  //非空时,从对头打印到队尾
  for(p=q->front->next;p!=NULL;p=p->next)
  {
    printf("%d\t",p->data);
  }
  printf("\n");
}


7、队列的链表实现源码

linkqueue.h

#ifndef __LINKQUEUE_H__
#define __LINKQUEUE_H__
 
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
 
typedef int datatype;
 
typedef struct linkqueuenode{
  datatype data;
  struct linkqueuenode *next;
}linkqueue_node,*linkqueue_pnode;
 
typedef struct linkqueue{
  linkqueue_pnode front,rear;
}link_queue,*link_pqueue;
 
extern void init_linkqueue(link_pqueue *Q);
extern bool is_empty_linkqueue(link_pqueue q);
extern bool in_linkqueue(datatype data,link_pqueue q);
extern bool out_linkqueue(link_pqueue q,datatype *D);
extern void show_linkqueue(link_pqueue q);
 
#endif


linkqueue.c      

#include "linkqueue.h"
 
void init_linkqueue(link_pqueue *Q)
{
  //申请front和rear的空间
  *Q=(link_pqueue)malloc(sizeof(link_queue));
  if((*Q)==NULL)
  {
    perror("malloc");
    exit(-1);
  }
  //申请头结点空间
  (*Q)->front=(linkqueue_pnode)malloc(sizeof(linkqueue_node));
  if((*Q)->front==NULL)
  {
    perror("malloc");
    exit(-1) ;
  }
 
  (*Q)->front->next=NULL;
  (*Q)->rear=(*Q)->front;
 
  return;
}
 
//入队
bool in_linkqueue(datatype data,link_pqueue q)
{
  linkqueue_pnode  new;
 
  //申请数据结点空间
  new=(linkqueue_pnode)malloc(sizeof(linkqueue_node));
  if(new==NULL)
  {
    puts("入队失败!");
    return false;
  }
  //将数据存储在申请的空间
  new->data=data;
  
  //将new指向的结点插入到链式队列中
  new->next=q->rear->next;
  q->rear->next=new;
  
  //让rear指针指向新的队尾结点
  q->rear=q->rear->next;
 
  return true;
}
 
bool is_empty_linkqueue(link_pqueue q)
{
  if(q->rear == q->front)
    return true;
  else
    return false;
}
 
//出队
bool out_linkqueue(link_pqueue q,datatype *D)
{
  linkqueue_pnode t;
  //判断队列是否空
  if(is_empty_linkqueue(q)){
    printf("队列已空!\n");
    return false;
  }
 
  //出队
  t=q->front;
  q->front =q->front->next;
  *D=q->front->data;
  free(t);
 
  return true;
}
 
void show_linkqueue(link_pqueue q)
{
  linkqueue_pnode p;
  if(is_empty_linkqueue(q))
    return;
  //非空时,从对头打印到队尾
  for(p=q->front->next;p!=NULL;p=p->next)
  {
    printf("%d\t",p->data);
  }
  printf("\n");
}


test.c

#include "linkqueue.h"
/* 用链式队列实现如下功能:
 * 用户从键盘输入整数,程序将其入对;
 * 用户从键盘输入字母,程序将队头元素出队;
 * 并在每一次出队和入队之后打印队列元素。
 */
int main(int argc, const char *argv[])
{
  link_pqueue q;
  datatype data,t,ret;
  
  init_linkqueue(&q);
 
  while(1)
  {
    printf("请输入一个整数或字符:");
    ret=scanf("%d",&data);
    
    //输入整数时,入对
    if(ret == 1)
    {
      if(in_linkqueue(data,q))
        show_linkqueue(q);
    }
    else
    {
      //输入为字符时
      if(out_linkqueue(q,&t))
      {
        printf("out:%d\n",t);
        show_linkqueue(q);
      }
      //清空输入缓冲区
      while(getchar()!='\n');
    }
  }
  return 0;
}
 


Makefile

CC = gcc
CFLAGS = -o0 -g -Wall
 
SRC=linkqueue.c test.c
OBJS=test
 
$(OBJS):$(SRC)
  $(CC) $(CFLAGS) -o $@ $^
 
.PHONY:clean
clean:
  rm -rf $(OBJS) *.o
  • "-o0"表示优化级别为0,即关闭优化。这将导致生成的可执行文件较大,但是可以方便地进行调试。
  • "-g"表示生成调试信息,以便在调试程序时可以查看变量的值、函数的调用栈等信息。
  • "-Wall"表示启用所有警告,编译器将会显示所有可能的警告信息,帮助开发人员发现潜在的问题。

编译结果测试:

相关文章
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
218 9
|
2月前
|
缓存 算法 调度
数据结构之 - 双端队列数据结构详解: 从基础到实现
数据结构之 - 双端队列数据结构详解: 从基础到实现
101 5
|
2月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
125 64
|
29天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
55 5
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
初步认识栈和队列
初步认识栈和队列
65 10
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
29 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
2月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
37 2
【数据结构】--- 栈和队列
【数据结构】--- 栈和队列
|
2月前
|
消息中间件 存储 Java
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
51 4