队列的链式存储结构

本文详细介绍了队列使用链式存储结构的实现方法,包括初始化、创建、入队、出队和遍历操作。通过示例代码演示了如何在链表中进行这些基本操作,并解释了相关细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列的顺序存储结构(参考前面文章:点击打开链接)比链式较为复杂些,顺序存储结构要构造循环队列; 但是链式就不需要,存储元素的内存 地址是随机的,用的时候再向os申请内存空间。链式存储结构中需要两个flag工作指针,过程相对较简单些。但是其中也有需要注意的细节。下面给出实现代码:

点击(此处)折叠或打开

  1. #include<iostream>
  2. using namespace std;
  3. typedef struct Queue{  //队列结点结构
  4.     char ch;
  5.     Queue *next;
  6. }*queue;
  7. typedef struct flaging {  //flag指针结构
  8.     queue front, rear;   
  9. }*flag;

  10. void initSqueue(queue);
  11. void initflag(flag);
  12. void createSqueue(queue, flag);
  13. void pushSqueue(queue, flag, char);
  14. void popSqueue(queue, flag);
  15. void throughSqueue(queue, flag);

  16. void initSqueue(queue q) {
  17.     q = new Queue;
  18. }
  19. void initflag(flag fg) {
  20.     fg = new flaging;
  21. }
  22. void createSqueue(queue q,flag fg){    
  23.     cout << "输入入队的元素:" << endl;
  24.     queue p,head;
  25.     head = q;
  26.     for (char ch; cin >> ch, ch != '#';) {

  27.         p = new Queue;
  28.         head->next=p;
  29.         p->ch = ch;
  30.         head = p;
  31.         head->next = NULL;
  32.     }
  33.     fg->front=q->next;
  34.     fg->rear = head;
  35. }
  36. void pushSqueue(queue q,flag fg,char ch) { //入队
  37.     q = fg->rear;
  38.     q->next = new Queue;
  39.     q->next->ch = ch;
  40.     q->next->next = NULL;
  41.     fg->rear = q->next;
  42. }
  43. void popSqueue(queue q,flag fg){  //出队
  44.     
  45.     q = fg->front;
  46.         cout << q->ch;
  47.         fg->front = q->next;
  48.         delete q;
  49. }
  50. void throughSqueue(queue q, flag fg) {//遍历队列,打印在队列中的元素
  51.     q = fg->front;
  52.     do{
  53.         cout << q->ch << " ";
  54.         q = q->next;
  55.     } while (!= NULL);
  56. }

  57. int main(){
  58.     Queue q;
  59.     flaging fg;
  60.     initSqueue(&q);
  61.     initflag(&fg);
  62.     createSqueue(&q, &fg);
  63.     pushSqueue(&q, &fg, 'F');
  64.     cout << "出队的元素是:";
  65.     popSqueue(&q, &fg);
  66.     cout << endl;
  67.     cout << "出队的元素是:";
  68.     popSqueue(&q, &fg);
  69.     cout << endl;
  70.     cout << "出队的元素是:";
  71.     popSqueue(&q, &fg);
  72.     cout << endl;
  73.     cout << "在队列中的元素是:" << endl; 
  74.     throughSqueue(&q, &fg);
  75.     cout << endl;
  76. }
运行结果:

该过程用下面图示简单的表示一下:


有朋友会问,为什么最后指向NULL结点,添加这一步似乎对程序的可读性没有带来多少好处,但是这一步关键之处,在 throughSqueue(queue q, flag fg)中,遍历整个队列时,用来判断遍历整个队列时退出的条件,对于该函数作用十分重要,但是如果不实现该函数功能的话,那么没有必要再构造出 NULL结点。队列的性质是从front指针处出队列,从rear指针处入队列,上面的示意图很清楚的看出这一性质,front,rear可以看成记忆指针,可以准确的告诉q指针该到什么位置工作,q指针可以看成是移动的。整个过程,画出图会很清晰,相信读者会有更精彩的功能实现。
队列是一种先进先出(FIFO)的数据结构,链式存储结构通过链表来实现队列。以下是一个使用Java实现的队列链式存储结构的示例代码: ```java class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } } public class Queue { private Node front; private Node rear; public Queue() { this.front = null; this.rear = null; } // 入队操作 public void enqueue(int data) { Node newNode = new Node(data); if (rear == null) { front = rear = newNode; return; } rear.next = newNode; rear = newNode; } // 出队操作 public int dequeue() { if (front == null) { throw new NoSuchElementException("Queue is empty"); } int data = front.data; front = front.next; if (front == null) { rear = null; } return data; } // 查看队头元素 public int peek() { if (front == null) { throw new NoSuchElementException("Queue is empty"); } return front.data; } // 判断队列是否为空 public boolean isEmpty() { return front == null; } // 打印队列元素 public void printQueue() { if (front == null) { System.out.println("Queue is empty"); return; } Node current = front; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); } public static void main(String[] args) { Queue queue = new Queue(); queue.enqueue(10); queue.enqueue(20); queue.enqueue(30); queue.printQueue(); System.out.println("Dequeued: " + queue.dequeue()); System.out.println("Dequeued: " + queue.dequeue()); queue.printQueue(); System.out.println("Peek: " + queue.peek()); System.out.println("IsEmpty: " + queue.isEmpty()); } } ``` 这个示例代码定义了一个`Node`类来表示链表中的节点,并定义了一个`Queue`类来实现队列的基本操作,包括入队、出队、查看队头元素、判断队列是否为空以及打印队列元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值