队列的基本操作(实现链式栈)

1. 熟悉队列的基本概念
只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表
(1)进行插入操作的一端称为队尾(入队列)
(2)进行删除操作的一端称为队头(出队列)
(3)队列具有先进先出(FIFO)的特性
2. 队列的性质
队列是一种操作受限制的线性表
3. 队列存储结构
顺序队列
队头指针不动,出队列时对头后的所有元素向前移动----要大量搬移元素
队头指针移动,出队列时对头向后移动一个位置----存在假溢出
循环队列(解决“假溢出”的办法就是后面满了,从头再开始,将头尾相接的顺序存储队列称为循环队列)
(rear + 1) % (空间大小) == front则队满
循环队列如何解决队列空或者满?
(1)少用一个存储单元:(队尾指针加一等于队头)
(2)设置一个标记位:(对头,队尾在同一位置:flag = 1存满了;flag = 0空)
(3)设置一个计数器:(count=0空;count等于空间总大小 满了)
四、实现链式栈

.h
  
# pragma once
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
# include<assert.h>
//实现链式队列的以下操作:
typedef int DataType;
typedef struct Node
{
 DataType _data;
 struct Node* _pNext;
}Node, *PNode;
typedef struct Queue
{
 PNode _pHead;
 PNode _pTail;
}Queue;
// 队列的初始化
void QueueInit(Queue* q);
// 入队列
void QueuePush(Queue* q, DataType data);
// 出队列
void QueuePop(Queue* q);
// 取队头元素
DataType QueueFront(Queue* q);
// 取队尾元素
DataType QueueBack(Queue* q);
// 获取队列中元素的个数
int QueueSize(Queue* q);
// 检测队列是否为空
int QueueEmpty(Queue* q);
PNode BuyNode(DataType data)
{
 PNode pNewNode = (PNode)malloc(sizeof(Node));
 if (NULL == pNewNode)
 {
  assert(0);
  return NULL;
 }
 pNewNode->_data = data;
 pNewNode->_pNext = NULL;
 return pNewNode;
}

.c
# define _CRT_SECURE_NO_WARNINGS 1
# include"Queue.h"
void QueueInit(Queue* q)
{
 assert(q);
 q->_pHead = q->_pTail = NULL;
}
void QueuePush(Queue* q, DataType data)
{
 assert(q);
 if (NULL == q->_pHead)
  q->_pHead = q->_pTail = BuyNode(data);
 else
 {
  q->_pTail->_pNext = BuyNode(data);
  q->_pTail = q->_pTail->_pNext;
 }
}
void QueuePop(Queue* q)
{
 PNode pDelNode = q->_pHead;
 if (pDelNode)
 {
  q->_pHead= pDelNode->_pNext;
  free(pDelNode);
 }
}
DataType QueueFront(Queue* q)
{
 assert(q);
 return q->_pHead->_data;
}
DataType QueueBack(Queue* q)
{
 assert(q);
 return q->_pTail->_data;
}
int QueueSize(Queue* q)
{
 int count = 0;
 PNode pCur = q->_pHead;
 while (pCur)
 {
  ++count;
  pCur = pCur->_pNext;
 }
 return count;
}
int QueueEmpty(Queue* q)
{
 return NULL == q->_pHead;
}

猜你喜欢

转载自blog.csdn.net/xuruhua/article/details/80047071