链表,栈,队列的区别及其应用

简介: 链表,栈,队列的区别及其应用

C语言链表、栈和队列都是常见的数据结构,在不同的应用场景中有着不同的用途。


1.链表(Linked List)


由节点(Node)组成的数据结构,其中每个节点包含一个数据元素和一个指向下一个节点的指针。链表可以是单向的(只有指向下一个节点的指针)或双向的(有指向上一个节点的指针)。链表的节点可以动态地添加或删除,因此适用于需要频繁插入或删除元素的场景。

#include <stdio.h>
#include <stdlib.h>
struct Node {
  int data;
  struct Node* next;
};
void insert(struct Node** head, int value) {
  struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
  newNode->data = value;
  newNode->next = (*head);
  (*head) = newNode;
}
void printList(struct Node* node) {
  while (node != NULL) {
  printf("%d ", node->data);
  node = node->next;
  }
}
int main() {
  struct Node* head = NULL;
  insert(&head, 3);
  insert(&head, 2);
  insert(&head, 1);
  printList(head);
  return 0;
}

链表的一些实例应用包括:


实现栈和队列:链表可以作为栈和队列的底层数据结构来实现,通过不同的操作方式可以实现栈和队列的功能。

实现高效的内存管理:链表可以用于动态分配内存空间,比如在操作系统中需要管理进程的堆栈,可以使用链表来实现。

实现图的邻接表:图中的节点和边可以使用链表来表示,可以方便地实现图的遍历和操作。

2.栈(Stack)


是一种后进先出(Last In First Out,LIFO)的数据结构,只能在栈顶进行插入和删除操作。


栈的一些实例应用包括:


函数调用和递归:函数调用时使用栈来保存局部变量和返回地址,递归也是通过栈来保存每层递归的状态。

表达式求值:栈可以用于中缀表达式转后缀表达式,然后通过栈来求解后缀表达式的值。

括号匹配:通过栈可以判断一个表达式中的括号是否匹配。


#include <stdio.h>
#define MAX_SIZE 100
struct Stack {
  int data[MAX_SIZE];
  int top;
};
void init(struct Stack* stack) {
  stack->top = -1;
}
int isEmpty(struct Stack* stack) {
  return stack->top == -1;
}
int isFull(struct Stack* stack) {
  return stack->top == MAX_SIZE - 1;
}
void push(struct Stack* stack, int value) {
  if (isFull(stack)) {
  printf("Stack is full!\n");
  return;
  }
  stack->data[++stack->top] = value;
}
int pop(struct Stack* stack) {
  if (isEmpty(stack)) {
  printf("Stack is empty!\n");
  return -1;
  }
  return stack->data[stack->top--];
}
int main() {
  struct Stack stack;
  init(&stack);
  push(&stack, 1);
  push(&stack, 2);
  push(&stack, 3);
  while (!isEmpty(&stack)) {
  printf("%d ", pop(&stack));
  }
  return 0;
}

3.队列(Queue)


是一种先进先出(First In First Out,FIFO)的数据结构,只能在队尾进行插入操作,在队头进行删除操作。


队列的一些实例应用包括:

任务调度:多线程或多进程环境下,队列可以用于调度任务的执行顺序。

缓冲区管理:队列可以用于控制数据在生产者和消费者之间的流动,实现缓冲区的管理。

广度优先搜索(BFS):在图的遍历中,队列可以用于保存遍历的节点,实现广度优先搜索算法。

#include <stdio.h>
#define MAX_SIZE 100
struct Queue {
  int data[MAX_SIZE];
  int front;
  int rear;
};
void init(struct Queue* queue) {
  queue->front = -1;
  queue->rear = -1;
}
int isEmpty(struct Queue* queue) {
  return queue->front == -1 || queue->front > queue->rear;
}
int isFull(struct Queue* queue) {
  return queue->rear == MAX_SIZE - 1;
}
void enqueue(struct Queue* queue, int value) {
  if (isFull(queue)) {
  printf("Queue is full!\n");
  return;
  }
  queue->data[++queue->rear] = value;
  if (queue->front == -1) {
  queue->front = 0;
  }
}
int dequeue(struct Queue* queue) {
  if (isEmpty(queue)) {
  printf("Queue is empty!\n");
  return -1;
  }
  return queue->data[queue->front++];
}
int main() {
  struct Queue queue;
  init(&queue);
  enqueue(&queue, 1);
  enqueue(&queue, 2);
  enqueue(&queue, 3);
  while (!isEmpty(&queue)) {
  printf("%d ", dequeue(&queue));
  }
  return 0;
}

4.总结:


C语言中链表、栈和队列都是常见的数据结构,用来存储和操作数据。

链表(Linked List)是一种动态数据结构,由一系列的节点组成,每个节点包含数据和指向下一个节点的指针。链表的特点是可以轻松地进行插入和删除操作,但是访问某个节点的时间复杂度是O(n)。链表可以分为单向链表和双向链表两种形式。

栈(Stack)是一种后进先出(Last In First Out, LIFO)的数据结构,只能在栈的一端进行插入和删除操作。插入操作称为入栈(push),删除操作称为出栈(pop)。栈可以通过数组或链表实现。

队列(Queue)是一种先进先出(First In First Out, FIFO)的数据结构,允许在一端进行插入操作(入队列,enqueue),在另一端进行删除操作(出队列,dequeue)。队列可以通过数组或链表实现。

总之: 链表适合频繁地进行插入和删除操作,但是访问某个节点的时间复杂度相对较高; 栈适合在一端进行插入和删除操作,用于实现简单的后进先出的逻辑; 队列适合在一端进行插入操作,在另一端进行删除操作,用于实现先进先出的逻辑。

相关文章
|
2月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
107 64
|
2月前
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
3月前
|
存储 Java 索引
【数据结构】链表从实现到应用,保姆级攻略
本文详细介绍了链表这一重要数据结构。链表与数组不同,其元素在内存中非连续分布,通过指针连接。Java中链表常用于需动态添加或删除元素的场景。文章首先解释了单向链表的基本概念,包括节点定义及各种操作如插入、删除等的实现方法。随后介绍了双向链表,说明了其拥有前后两个指针的特点,并展示了相关操作的代码实现。最后,对比了ArrayList与LinkedList的不同之处,包括它们底层实现、时间复杂度以及适用场景等方面。
71 10
【数据结构】链表从实现到应用,保姆级攻略
|
2月前
|
存储
探索数据结构:单链表的实践和应用
探索数据结构:单链表的实践和应用
|
3月前
|
前端开发 JavaScript C++
详解链表在前端的应用,顺便再弄懂原型和原型链!
该文章深入解析了链表在前端开发中的应用,并详细阐述了JavaScript中的原型和原型链的概念及其工作原理。
|
5月前
|
存储
数组与链表有什么区别
数组与链表有什么区别
|
6月前
|
存储 算法
单链表的应用
单链表的应用
42 6
|
6月前
|
存储 算法 C语言
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
|
6月前
链表\链表基础应用
链表\链表基础应用
24 3
|
6月前
|
数据安全/隐私保护
第2章 栈、队列、链表
第2章 栈、队列、链表